我有一个对象数组:
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。
答案 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; }