代码之家  ›  专栏  ›  技术社区  ›  zomdar

如何将2个数组组合成1个对象javascript

  •  1
  • zomdar  · 技术社区  · 7 年前

    我有两个数组,我想“缩小”成一个对象。

    例如:

    我有。。

    var originalData = [1,2,3];
    
    var newData = [3,1,2];
    

    我想将这两个数组组合成如下所示的对象:

    var newOrderObject = {1:3, 2:1, 3:2};
    

    我正在使用reduce函数,但它似乎在以不同的方式映射它们

    var newOrderObject = originalData.reduce(function(newData) {
      var orderObject = {};
      originalData = newData;
      return orderObject;
    }, {});
    

    任何建议都会被逮捕

    3 回复  |  直到 7 年前
        1
  •  6
  •   Ori Drori    7 年前

    减少第一个数组(键),并使用 index :

    var originalData = [1,2,3];
    var newData = [3,1,2];
    
    var newOrderObject = originalData.reduce(function(obj, key, index) {
      obj[key] = newData[index];
      return obj;
    }, {});
    
    console.log(newOrderObject);
        2
  •  3
  •   nicholaswmin    7 年前

    你只是在使用 .reduce 错了。

    • 它回调的第一个参数是 累加器 对象你 通过。
    • 第二个是当前迭代的项。
    • 第三个是索引。

    使用这三个选项,你就能得到你想要的结果。

    var originalData = [1,2,3];
    var newData = [3,1,2];
    
    var newOrderObject = originalData.reduce(function(acc, item, i) {
      return Object.assign(acc, { [item]: newData[i] })
    }, {});
    
    console.log(newOrderObject)
        3
  •  3
  •   Nina Scholz    7 年前

    您可以映射单个对象并将其分配给单个对象。如果可以使用空数组,请使用空对象作为目标值。

    var keys = [1, 2, 3],
        values = [3, 1, 2],
        object = Object.assign({}, ...keys.map((k, i) => ({ [k]: values[i] })));
    
    console.log(object);

    更干净的方法是将数组转置为键/值对数组,然后映射对象。

    const transpose = (r, a) => a.map((v, i) => (r[i] || []).concat(v));
    
    var keys = [1, 2, 3],
        values = [3, 1, 2],
        object = Object.assign(
            {},
            ...[keys, values]
                .reduce(transpose, [])
                .map(([k, v]) => ({ [k]: v }))
        );
    
    console.log(object);