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

时间:2018-12-07 16:19:07

标签: javascript arrays javascript-objects

我有一个对象数组:

add_theme_support( 'custom-logo', array(
'height'      => 240,
'width'       => 240,
'flex-height' => true, ) );

是否存在不带for循环的“ X”合并有效方法?这样我最终得到:

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}
]

因此,寻找常见的objArray = [ {x: 1, y: 7, z: 9, n: 6}, {x: 2, y: 14, z: 18, n: 16} ] 并将所有匹配项合并到一个对象中?可以修改原始数组或创建一个新数组。

我知道这可以通过循环来完成,但是我不确定该实现是否要进行太多循环,尽管我不确定是否可以使用reduce或filter。

3 个答案:

答案 0 :(得分:3)

您可以使用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)

答案 1 :(得分:3)

您可以使用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 );

答案 2 :(得分:3)

您可以使用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; }