我正在尝试合并大型数据集中的多个项目。基本上,我想首先过滤项目(IE仅在某些对象上执行此操作),然后返回我通过的键。
在我的示例中,我可能采用完全错误的方法。它必须非常灵活-因为数据可能缺少键(例如foo
不会出现在每个项目上)。
我相信应该减少使用吗?
示例代码:https://jsfiddle.net/rxLgm4nw/35/
const data = { a: { foo: "x", bar: ["y"] }, b: { foo: "1", bar: ["z"] } };
const checkObjs = ["a", "b"];
const keysToReturn = ["foo", "bar"];
const res = checkObjs
.map(key => {
return keysToReturn.map(area => {
if (data[key][area]) {
return { [area]: data[key][area] };
}
});
})
.reduce((x, y) => [...x, ...y], []);
期望结果
[{
foo: ['x', '1'],
bar: ['y', 'z']
}]
答案 0 :(得分:2)
这是我的解决方案。我想这就是您要寻找的东西:
const data = { a: { foo: "x", bar: ["y"] }, b: { foo: "1", bar: ["z"] } }
const checkObjs = ["a", "b"]
const keysToReturn = ["foo", "bar"]
const result = keysToReturn.reduce((acc, item) => {
acc[item] || (acc[item] = [])
checkObjs.forEach(key => {
acc[item] = acc[item].concat(data[key][item])
})
return acc
}, {})
console.log([result])
答案 1 :(得分:0)
如果不确定如何使用reduce或map,可以始终遵循基础知识。
它可能不那么优雅和/或高性能,但它可以完成工作。
const data = {
a: {
foo: 'x',
bar: ['y']
},
b: {
foo: '1',
bar: ['z']
}
}
var res = {};
const checkObjs = {
a: 1,
b: 1
};
const keysToReturn = {
foo: 1,
bar: 1
};
for (var k in data) {
if (k in checkObjs) {
for (var k2 in data[k]) {
if (k2 in keysToReturn) {
if (typeof res[k2] === 'undefined') {
res[k2] = [];
}
res[k2] = res[k2].concat(data[k][k2]);
}
}
}
}
console.log('data!', res)