假设我的对象数组如下:
reduce
我想编写类似rule.column
操作的内容,检查array2 = [
{
rule: {
column: "colName",
value: ["val1", "val2", "val3"]
}
},
{
rule: {
column: "colName2",
value: ["val4"]
}
}
]
是否对所有数组元素都相等,如果是,则在删除其他元素时将其中一个值推入其中。
给我一些类似的东西:
function
有直接的方法吗?
我绝对可以写一个常规reduce
来做这件事,但我假设我应该能够在array1
上进行otherProperty: {}
操作吗?
修改:原始问题在rule
之后有BalanceType.ESTIMATED
个属性,但我的对象实际上并没有(它位于高级对象上)
答案 0 :(得分:3)
当然,只需使用与每列匹配的键创建一个对象,推送到内部values
数组,然后获取对象的值:
const input = [{
rule: {
column: "colName",
value: 'v1'
},
otherProperty: 'otherProp',
},
{
rule: {
column: "colName",
value: 'v2'
},
otherProperty: 'otherProp',
},
{
rule: {
column: "colName",
value: 'val3',
},
otherProperty: 'otherProp',
},
{
rule: {
column: "colName2",
value: 'val4'
},
otherProperty: 'otherProp',
}
];
const outputCols = input.reduce((outputCols, { rule: { column, value }, ...otherProps}) => {
if (!outputCols[column]) {
outputCols[column] = { rule: { column, value: [] }, ...otherProps };
}
outputCols[column].rule.value.push(value);
return outputCols;
}, {});
console.log(Object.values(outputCols));
请注意,如果otherProps
在后续对象中有所不同,则当前将忽略它们。
答案 1 :(得分:1)
您可以使用函数reduce
进行分组,然后将值作为数组获取。
名称otherProperty
超出范围,但您可以使用函数Object.assign
或Spread语法。
let array1 = [ { rule: { column: "colName", value: ["val1"] }, otherProperty: {} }, { rule: { column: "colName", value: ["val2"] }, otherProperty: {} }, { rule: { column: "colName", value: ["val3"] }, otherProperty: {} }, { rule: { column: "colName2", value: ["val4"] }, otherProperty: {} }],
result = Object.values(array1.reduce((a, c) => {
(a[c.rule.column] || (a[c.rule.column] = {rule: {column: c.rule.column, value: []}, otherProperty: {}})).rule.value.push(...c.rule.value);
return a;
}, {}));
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }