将JavaScript中'_id'键具有相同值的所有对象组合在一起

假设我们有一个这样的对象数组-

const arr = [

   {_id : "1", S : "2"},

   {_id : "1", M : "4"},

   {_id : "2", M : "1"},

   {_id : "" , M : "1"},

   {_id : "3", S : "3"}

];

我们需要编写一个JavaScript函数,该函数接受一个这样的数组,并将所有具有相同“ _id”键值的对象组合在一起。

因此,最终输出应如下所示:

const output = [

   {_id : "1", M : "4", S : "2", Total: "6"},

   {_id : "2", M : "1", S : "0", Total: "1"},

   {_id : "6", M : "1", S : "0", Total: "1"},

   {_id : "3", M : "0", S : "3", Total: "3"}

];

示例

为此的代码将是-

const arr = [

   {_id : "1", S : "2"},

   {_id : "1", M : "4"},

   {_id : "2", M : "1"},

   {_id : "6" , M : "1"},

   {_id : "3", S : "3"}

];

const pickAllConstraints = arr => {

   let constraints = [];

   arr.forEach(el => {

      const keys = Object.keys(el);

      constraints = [...constraints, ...keys];

   });

   return constraints.filter((el, ind) => el !== '_id' && ind === constraints.lastIndexOf(el));

};

const buildItem = (cons, el = {}, prev = {}) => {

   const item = {};

   let total = 0

   cons.forEach(i => {

      item[i] = (+el[i] || 0) + (+prev[i] || 0);

      total += item[i];

   });

   item.total = total;

   return item;

}

const buildCumulativeArray = arr => {

   const constraints = pickAllConstraints(arr);

   const map = {}, res = [];

   arr.forEach(el => {

      const { _id } = el;

      if(map.hasOwnProperty(_id)){

         res[map[_id] - 1] = {

            _id, ...buildItem(constraints, el, res[map[_id] - 1])

         };

      }else{

         map[_id] = res.push({

            _id, ...buildItem(constraints, el)

         });

      }

   });

   return res;

};

console.log(buildCumulativeArray(arr));

输出结果

控制台中的输出将是-

[

   { _id: '1', M: 4, S: 2, total: 6 },

   { _id: '2', M: 1, S: 0, total: 1 },

   { _id: '6', M: 1, S: 0, total: 1 },

   { _id: '3', M: 0, S: 3, total: 3 }

]

以上是 将JavaScript中'_id'键具有相同值的所有对象组合在一起 的全部内容, 来源链接: utcz.com/z/340785.html

回到顶部