用于累积其他属性相同的所有对象属性的对象数组

时间:2018-04-29 01:38:21

标签: javascript arrays dictionary reduce

假设我的对象数组如下:

reduce

我想编写类似rule.column操作的内容,检查array2 = [ { rule: { column: "colName", value: ["val1", "val2", "val3"] } }, { rule: { column: "colName2", value: ["val4"] } } ] 是否对所有数组元素都相等,如果是,则在删除其他元素时将其中一个值推入其中。 给我一些类似的东西:

function

有直接的方法吗? 我绝对可以写一个常规reduce来做这件事,但我假设我应该能够在array1上进行otherProperty: {}操作吗?

修改:原始问题在rule之后有BalanceType.ESTIMATED 个属性,但我的对象实际上并没有(它位于高级对象上)

2 个答案:

答案 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; }