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

用相似键合并数组中的对象

  •  1
  • Mormoran  · 技术社区  · 6 年前

    我有一组对象:

    objArray = [
        {x: 1, y: 7},
        {x: 2, y: 14},
        {x: 1, z: 9},
        {x: 2, z: 18}
        {x: 1, n: 6}
        {x: 2, n: 16}
    ]
    

    在没有for循环的情况下,是否有一种有效的方法来合并“x”?最后我得到:

    objArray = [
        {x: 1, y: 7, z: 9, n: 6},
        {x: 2, y: 14, z: 18, n: 16}
    ]
    

    所以寻找共同点 objArray[n]["x"] 把所有的点击合并成一个对象?可以修改原始数组或创建新数组。

    我知道这可以通过一个循环来完成,但是我正在尝试避免这个实现中有太多的循环,尽管我不确定reduce或filter是否可以实现。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Nina Scholz    6 年前

    你可以拿一个 Map 按属性分组 x .

    var array = [{ x: 1, y: 7 }, { x: 2, y: 14 }, { x: 1, z: 9 }, { x: 2, z: 18 }, { x: 1, n: 6 }, { x: 2, n: 16 }],
        result = Array.from(
            array
                .reduce((m, o) => m.set(o.x, Object.assign({}, m.get(o.x), o)), new Map)
                .values()
        );
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        2
  •  3
  •   Nenad Vracar    6 年前

    你可以使用 reduce 方法生成一个对象,然后 Object.values 得到一个数组。

    const data = [{"x":1,"y":7},{"x":2,"y":14},{"x":1,"z":9},{"x":2,"z":18},{"x":1,"n":6},{"x":2,"n":16}]
    const res = data.reduce((r, {x, ...rest}) => {
      if(!r[x]) r[x] = {x, ...rest}
      else Object.assign(r[x], rest);
      return r;
    }, {})
    
    const result = Object.values(res);
    
    console.log(result)
        3
  •  3
  •   Paul    6 年前

    你可以用 Array#reduce :

    const objArray = [
        {x: 1, y: 7},
        {x: 2, y: 14},
        {x: 1, z: 9},
        {x: 2, z: 18},
        {x: 1, n: 6},
        {x: 2, n: 16},
    ]
    
    const result = Object.values( objArray.reduce( 
      (p,c) => (p[c.x] = Object.assign( {}, p[c.x], c ), p ), {}
    ) );
    
    console.log( result );