如何减去对象值并将结果添加到新的 属性

How to subtract object values and add result to a new property

我有一组这样的对象

const arr = [
  {time: '21/1/1998', sold: 8848},
  {time: '21/1/1997', sold: 8804},
  {time: '21/1/1996', sold: 8756},
  {time: '21/1/1995', sold: 8732},
  {time: '21/1/1994', sold: 8691},
  {time: '21/1/1993', sold: 8620},
  {time: '21/1/1992', sold: 8511},
  {time: '21/1/1991', sold: 8511},
  {time: '21/1/1990', sold: 8498},
];

我想要实现的是减去销售价值 first - secondsecond - thirdthird - fourth 等,并将该价值添加到新的 属性 称为 soldInPeriod 最后一个应该是0.

这是我想要的示例:

const arr = [
  {time: '21/1/1998', sold: 8848, soldInPeriod: 44},
  {time: '21/1/1997', sold: 8804, soldInPeriod: 48},
  {time: '21/1/1996', sold: 8756, soldInPeriod: 24},
  {time: '21/1/1995', sold: 8732, soldInPeriod: 41},
  {time: '21/1/1994', sold: 8691, soldInPeriod: 71},
  {time: '21/1/1993', sold: 8620, soldInPeriod: 109},
  {time: '21/1/1992', sold: 8511, soldInPeriod: 0},
  {time: '21/1/1991', sold: 8511, soldInPeriod: 13},
  {time: '21/1/1990', sold: 8498, soldInPeriod: 0},
];

我试图通过使用 reduce

来实现这一点
const newArr = Object.values(arr.reduce(function(r, { time, sold }) {
    r[sold] = r[sold] || {time, sold, soldInPeriod: 0 };
    console.log(sold)
    r[sold].soldInPeriod = r[sold].sold - sold;
    return r;
}, Object.create(null)));

console.log(newArr)

但这不是我想要的,因为 soldInPeriod 始终为 0。我该怎么做?任何示例将不胜感激!

简单地映射数组并获取具有索引的下一个对象并减去该值。

const arr = [
  { time: "21/1/1998", sold: 8848 },
  { time: "21/1/1997", sold: 8804 },
  { time: "21/1/1996", sold: 8756 },
  { time: "21/1/1995", sold: 8732 },
  { time: "21/1/1994", sold: 8691 },
  { time: "21/1/1993", sold: 8620 },
  { time: "21/1/1992", sold: 8511 },
  { time: "21/1/1991", sold: 8511 },
  { time: "21/1/1990", sold: 8498 },
];

const result = arr.map((obj, i, srcArray) => {
  return { ...obj, soldInPeriod: obj.sold - srcArray[i + 1]?.sold || 0 };
});

console.log(result);

使用单行语法

const result = arr.map((obj, i, srcArray) => ({ ...obj, soldInPeriod: obj.sold - srcArray[i + 1]?.sold || 0 }));

使用数组映射方法:


arr.map((item, idx, src) => {
    if (idx === arr.length - 1)
        item.soldInPeriod = 0
    else
        item.soldInPeriod = item.sold - src[idx+1].sold;

    return item;
})

试试这个。

for(let i = 0; i<arr.length;i++){
    arr[i].soldInPeriod = arr[i].sold - arr[i+1]?.sold || 0
}

您也可以使用 ForEach 循环来进一步简化它。

arr.forEach((item,index) => {
    item.soldInPeriod = item.sold - arr[index+1]?.sold || 0
})