在保留原始Object结构的同时,我很难根据另一个数组过滤嵌套Object的键。
输入:
data = [
{0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
{1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
]
arr = [g1, g2, g3]
预期输出:
data = [
{0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0}}}},
{1: { key: "B", values: { 0: {g2: 0, g3: 0}}}}
]
到目前为止我做了什么:
data.forEach(function(e,i) {
r = Object.keys(e[i].values[0]).filter(d => arr.includes(d))
console.log(r)
})
这可以正确打印[g1,g2,g3]和[g2,g3],但是我想保留原始的Object结构,而不仅仅是列出公用键。
答案 0 :(得分:0)
此代码可满足您的需求。将数组r
简化为一个对象,并将其分配给原始对象。
var data = [
{0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
{1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
]
var arr = ["g1", "g2", "g3"]
var output = data.map(function(e,i) {
var r = Object.keys(e[i].values[0]).filter(d => arr.includes(d));
var values = r.reduce((obj,key)=>{obj[key] = 0 ; return obj;},{});
var obj = {};
obj[i] = Object.assign(e[i],{values:{0:values}})
console.log(obj);
return obj;
})
console.log(output);
实际上,这并不比从头开始重建输出对象好多少
var data = [
{0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
{1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
]
var arr = ["g1", "g2", "g3"]
var output = data.map(function(e,i) {
var obj = {};
obj[i] = {key : e[i].key, values : {0:{}}};
arr.forEach((ele)=>{
if(e[i].values[0][ele] != undefined)
{
obj[i].values[0][ele] = e[i].values[0][ele];
}
});
console.log(obj);
return obj;
})
console.log(output);
答案 1 :(得分:0)
假设您的data
对象是正确的形式(说明包含在代码注释中),也许类似的事情可以解决问题。
function pruneObject(object, desiredKeys) {
Object.keys(object)
.filter(key => !desiredKeys.includes(key)) //Ignore desired keys
.forEach(key => delete object[key]) //Remove the leftovers
}
var data = [{ 0: { key: "A", values: { 0: { g1: 0, g2: 0, g3: 0, g4: 0 } } } }, { 1: { key: "B", values: { 0: { g2: 0, g3: 0, g5: 0 } } } } ];
var arr = ['g1', 'g2', 'g3'];
data.forEach((item,index) => pruneObject(item[index].values[0], arr)); //Prune each "values" object
console.log(data);
注意:,这会修改原始对象,尽管如有必要,我可以编写一个替代解决方案来保留它并返回一个新对象。