合并对象和数组

时间:2015-09-16 07:22:11

标签: javascript arrays object ecmascript-6

我正在尝试编写一个函数,它接受一个对象数组和无限数量的数组,并将它们组合成一个对象。输入将遵循以下模式:

let x = [{ name: 'Tom' }, { name: 'John' }, { name: 'Harry' }];
let y = [[1, 2, 3], 'id'];
let z = [['a', 'b', 'c'], 'value'];

combine(x, y, z);

使用yz的第二个元素作为对象键。使用这些参数,该函数应返回以下数组:

[
  {
    name: 'Tom',
    id: 1,
    value: 'a'
  },
  {
    name: 'John',
    id: 2,
    value: 'b'
  },
  {
    name: 'Harry',
    id: 3,
    value: 'c'
  },
]

应使用当前对象的索引来获取数组中的正确元素。我试图解决这个问题:

function combine(object, ...arrays) {
  return object.map((obj, index) => {
    let items = arrays.map(arr => ({ 
      [arr[1]]: arr[0][index] 
    }));

    return Object.assign({}, obj, { items });
  });
}

这几乎完成了这项工作,但导致数组项隐藏在嵌套的items数组中,我该如何解决?

3 个答案:

答案 0 :(得分:3)

您一直在分配一个对象对象,结果是一个内部有元素项的新对象(对象文字的另一个特征)。

此方法使用reduce而不是map和direct assign而不是object literal。

function combine(object, ...arrays) {
  return object.map((obj, index) => {
    const items = arrays.reduce((acc, arr) => { 
      acc[arr[1]] = arr[0][index] ;
      return acc;
    }, {});

    return Object.assign({}, obj, items);
  });
}

const x = [{ name: 'Tom' }, { name: 'John' }, { name: 'Harry' }];
const y = [[1, 2, 3], 'id'];
const z = [['a', 'b', 'c'], 'value'];

combine(x, y, z);

您也可以在Object.assign中使用spread运算符,如下所示:

function combine(object, ...arrays) {
  return object.map((obj, index) => {
    let items = arrays.map(arr => ({ 
      [arr[1]]: arr[0][index] 
    }));

    return Object.assign({}, obj, ...items);
  });
}

答案 1 :(得分:1)

  

这几乎可以完成工作,但会导致数组项隐藏在嵌套项数组

问题是items是一个数组,而您只需要该特定map回调中的当前项。这里不需要嵌套循环。

另外,我建议每combine次调用避免多个属性。生成的代码如下所示:

function combine(objects, [values, key]) {
    return objects.map((o, i) =>
        Object.assign({[key]: values[i]}, o)
    );
}
combine(combine(x, y), z);

如果您有多个扩展程序要做,您也可以使用

[y, z].reduce(combine, x)

答案 2 :(得分:0)

使用地图和计算键,您可以实现此目的。 这是一个有效的例子:

let x = [{
    name: 'Tom'
}, {
    name: 'John'
}, {
    name: 'Harry'
}];
let y = [[1, 2, 3], 'id'];
let z = [['a', 'b', 'c'], 'value'];

let result = [];

x.map(function (el, index) {
  result.push(el);
  let index = result.length -1;

  result[index][y[1]] = y[0][index];
  result[index][z[1]] = z[0][index];
});

console.log(result);