Javascript:折叠属性值上的对象数组,求和数量属性,保留最新的

tar*_*gon 5 javascript functional-programming

寻找一种更“实用”的方式来实现这一目标......

我有一个看起来像这样的产品对象(注意重复的skuid

"products": [
    {
      "skuid": "B1418",
      "name": "Test Product 1",
      "price": 7,
      "lastOrderedDate": 20181114,
      "quantity": 2
    },{
      "skuid": "B3446",
      "name": "Test Product 2",
      "price": 6,
      "lastOrderedDate": 20190114,
      "quantity": 2
    },{
      "skuid": "B1418",
      "name": "Test Product 1",
      "price": 7,
      "lastOrderedDate": 20180516,
      "quantity": 5
    },{
      "skuid": "B3446",
      "name": "Test Product 2",
      "price": 6,
      "lastOrderedDate": 20180411,
      "quantity": 11
    }
]
Run Code Online (Sandbox Code Playgroud)

我想创建一个新数组,每个不同的对象都有一个对象skuid,但对所有quantity值求和保留最新的lastOrderedDate

最终结果如下:

"products": [
    {
      "skuid": "B1418",
      "name": "Test Product 1",
      "price": 7,
      "lastOrderedDate": 20181114,
      "quantity": 7
    },{
      "skuid": "B3446",
      "name": "Test Product 2",
      "price": 6,
      "lastOrderedDate": 20190114,
      "quantity": 13
    }
]
Run Code Online (Sandbox Code Playgroud)

我可以用一堆 forEach 和 if 来做到这一点,但我想学习一种更简洁的方法来做到这一点。那么也许有某种排序reduce

Nin*_*olz 1

您可以Map稍后获取所有值作为结果集。

const
    getGrouped = (m, o) => {
        var item = m.get(o.skuid);
        if (!item) return m.set(o.skuid, Object.assign({}, o));
        if (item.lastOrderedDate < o.lastOrderedDate) item.lastOrderedDate = o.lastOrderedDate;
        item.quantity += o.quantity;
        return m;
    };


var data = { products: [{ skuid: "B1418", name: "Test Product 1", price: 7, lastOrderedDate: 20181114, quantity: 2 }, { skuid: "B3446", name: "Test Product 2", price: 6, lastOrderedDate: 20190114, quantity: 2 }, { skuid: "B1418", name: "Test Product 1", price: 7, lastOrderedDate: 20180516, quantity: 5 }, { skuid: "B3446", name: "Test Product 2", price: 6, lastOrderedDate: 20180411, quantity: 11 }] },
    result = Array.from(data.products
        .reduce(getGrouped, new Map)
        .values()
    );

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)