将 reducer 与具有可变键名的对象一起使用

Use a reducer with an object that have a variable key name

问题是:

const arr = [
  { name1: 'value1', qty: 1, time: 1 },
  { name1: 'value2', qty: 1, time: 2 },
];

// using this reducer works!
const reducer = (acc, { name1, qty}) => {
  const newQty = parseInt(acc[name1] ?? 0) + parseInt(qty); //?
  return {
    ...acc,
    [name1]: newQty
  };
};


arr.reduce(reducer, {})
// this returns: {value1: sum, value2: sum, ... }

到目前为止一切顺利...但是当你拥有这个时会发生什么?

const arr2 = [
  { name2: 'valueX', qty: 1, time: 1},
  { name2: 'valueY', qty: 1, time: 2},
];

复制粘贴然后更改名称当然可以,但是还有其他方法吗?

原来有:

const reducer = (acc, { time, qty, ...rest }) => {
  const name = Object.values(rest);
  const newQty = parseInt(acc[name] ?? 0) + parseInt(qty);
  return {
    ...acc,
    [name]: newQty
  };
};

只要您需要减少的所有对象都具有该格式,这就可以正常工作。

(我没有测试添加不存在的键,但可能仍然有效...)

您需要做的就是通过显式显示所有“通用”键并使用扩展运算符捕捉变化的键来“删除”。

这实际上取决于您的具体用例,但您可以创建一个生成正确减速器的函数,将密钥作为输入:

const arr = [
  { name1: 'value1', qty: 1, time: 1 },
  { name1: 'value2', qty: 1, time: 2 },
];

// using this reducer works!
const makeReducer = key => (acc, cur) => {
  const newQty = parseInt(acc[key] ?? 0) + parseInt(cur.qty); 
  return {
    ...acc,
    [cur[key]]: newQty
  };
};

console.log(arr.reduce(makeReducer('name1'), {}))

const arr2 = [
  { name2: 'valueX', qty: 1, time: 1},
  { name2: 'valueY', qty: 1, time: 2},
];
console.log(arr2.reduce(makeReducer('name2'), {}))