从嵌套对象中删除所有键,不包括js中的一个键

Anji

我有一个 JSON 对象,如下所示:

x = {
    "prop1": {
        "description": "prop1",
        "dataType": "string",
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "description": "sub1",
            "dataType": "integer",
            "value" : 12
        },
        "sub2": {
            "description": "sub2",
            "dataType": "integer"
        }
    },
    "prop3": {
        "input": {
            "name": {
                "description": "input messages",
                "dataType": "boolean",
                "value": false
            }
        },
        "output": {
            "description": "output messages",
            "dataType": "boolean",
            "value": false
        }
    }
}

在上面的对象中,我想删除键(描述,数据类型),如果键没有任何,也删除键。上述的预期输出如下。

y = {
    "prop1": {
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "value" : 12
        }
    },
    "prop3": {
        "input": {
            "name": {
                "value": false
            }
        },
        "output": {
            "value": false
        }
    }
}

我目前的解决方案如下:

function findValue(obj, string, obj1) {
    if (obj.hasOwnProperty("value")) {
        obj1[string.substring(1)] = obj.value
        return
    }
    for (var key in obj) {
        findValue(obj[key], [string, key].join("."), obj1)
    }
}

console.log(x);
var x1 = {}
findValue(x, "", x1)
var y = {};

function assign(obj, keyPath, value) {
    const lastKeyIndex = keyPath.length - 1;
    for (var i = 0; i < lastKeyIndex; ++i) {
      const key = keyPath[i];
      if (!(key in obj)) {
          obj[key] = {}
      }
      obj = obj[key];
    }
    obj[keyPath[lastKeyIndex]] = { "value": value };
}

Object.keys(x1).forEach(key => {
    const keyPath = key.split('.');
    let value = x1[key];
    if (value != null) {
        this.assign(y, keyPath, value);
    }
});

console.log(y);

我做了很长时间。我首先将我的对象转换为一种格式,其中每个键都是父键和子键的组合,然后将其转换为预期的格式。

有没有办法让它更好?

某些表演

我会编写一个通用的项目处理函数。如果该项目是一个对象,则遍历其值并递归调用该函数,如果有任何与键匹配的嵌套值,则返回一个新对象如果没有与键匹配的嵌套值,则返回一个唯一值(可以是 Symbol),指示调用者应该从父对象中删除该值:

const removeThis = Symbol();
const transform = item => {
  if (typeof item !== 'object' || item === null) {
    return item;
  }
  const newEntries = [];
  for (const [key, val] of Object.entries(item)) {
    if (key === keyToKeep) newEntries.push([key, val]);
    else if (typeof val === 'object' && val !== null) {
      const possibleNewObj = transform(val);
      if (possibleNewObj !== removeThis) {
        newEntries.push([key, possibleNewObj]);
      }
    }
  }
  return newEntries.length
    ? Object.fromEntries(newEntries)
    : removeThis;
};

const obj = {
    "prop1": {
        "description": "prop1",
        "dataType": "string",
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "description": "sub1",
            "dataType": "integer",
            "value" : 12
        },
        "sub2": {
            "description": "sub2",
            "dataType": "integer"
        }
    },
    "prop3": {
        "input": {
            "name": {
                "description": "input messages",
                "dataType": "boolean",
                "value": false
            }
        },
        "output": {
            "description": "output messages",
            "dataType": "boolean",
            "value": false
        }
    }
};
const keyToKeep = 'value';
console.log(transform(obj));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为递归/嵌套对象数组中的所有路径创建一个键映射

从对象数组中删除所有但最后一个相似的键

一个如何删除对象中JavaScript中不存在于数组中的所有键?

有没有办法将所有键都包含在一个对象(包括子对象)中?

如何从嵌套字典中删除一个键?

是否有一个神奇的功能可以从jsonb中提取所有选择键/嵌套键,包括数组

删除对象的键也会删除另一个对象中的键-Javascript

如何从 mongodb 获取的对象中删除一个键?

从 Map 对象的副本中删除一个键

PHP添加数组中不包括最后一个的所有值

嵌套在嵌套对象中,具有与mongoDB中的另一个集合相同的键聚合

计算对象中 X 是第一个键字母的所有值

向数组中的所有对象附加一个键

如果列表中存在重复键,则删除除另一个值更高的所有键之外的所有键

删除除一个以外的所有键,但将所有值保留在python字典中

如何从具有两个键的变量中删除一个键?

在嵌套的 elasticsearch 对象中的所有键中搜索值

如果对象中存在两个键或只有一个键,则逻辑不同?

从稍微嵌套的数组中删除重复项后,保留对象的所有键

如果键等于给定键,如何删除嵌套字典中的所有键

试图将与键匹配的所有值拉到一个键中

从嵌套哈希中删除所有类似的键

从对象内的所有对象中逐键删除元素

从数组中的所有对象中删除键

从对象中的所有键中删除字符 (Lodash OK)

如何替换javascript中嵌套对象的所有键

JS如何返回一个对象,一键分享所有的值

如何从嵌套对象中删除一组键?

复制一个对象中的所有元素,除了那些与另一个对象中的元素共享键的元素