通过键合并多个数组

时间:2018-07-30 11:39:53

标签: javascript arrays json

我正在尝试合并大型数据集中的多个项目。基本上,我想首先过滤项目(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']
}]

2 个答案:

答案 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)