0

我有一个数组

[
  { price: 10 },
  { price: 10 },
  { price: 10 },
  { price: 10 },
  { price: 20 },
  { price: 20 },
]

我希望它变成

[
  { numElements: 4, price: 10 },
  { numElements: 2, price: 20 },
]

我曾尝试使用arr.reduce((prev, curr) => ..., [])来完成此操作,但我不知道该怎么做。

4

5 回答 5

0

你可以试试这个:

let arr = [
  { price: 10 },
  { price: 10 },
  { price: 10 },
  { price: 10 },
  { price: 20 },
  { price: 20 },
]

let result = []

let counter = {}

arr.forEach( el => {

  if (!counter[el.price]) counter[el.price] = 1
  else counter[el.price]++

  console.log(counter[el.price])

})

for (let id in counter) {
  result.push({numElements: counter[id], price: id})
}
于 2017-08-07T16:07:21.483 回答
0

您可以在结果数组中查找价格,如果找不到,则插入一个新对象。

var data = [{ price: 10 }, { price: 10 }, { price: 10 }, { price: 10 }, { price: 20 }, { price: 20 }],
    grouped = data.reduce((r, { price }) => {
        var t = r.find(p => price === p.price);
        t || r.push(t = { numElements: 0, price });
        t.numElements++;
        return r;
    }, []);
    
console.log(grouped);

于 2017-08-08T15:01:27.727 回答
0

假设数据按price属性排序,.reduce()您可以按以下方式进行操作;

var data   = [{ price: 10 }, { price: 10 }, { price: 10 }, { price: 10 }, { price: 20 }, { price: 20 }],
    result = data.reduce((r,d,i) => i ? r[r.length-1].price === d.price ? (r[r.length-1].numElemenets++, r)
                                                                        : (r.push(Object.assign({}, d, {numElemenets: 1})),r)
                                      : [Object.assign({}, d, {numElemenets: 1})], {});
console.log(result);

于 2017-08-07T19:36:28.190 回答
0

传统方法可能会使用 afor/loop来处理数据,但如今 JavaScript 有许多可以提供帮助的函数式方法。此代码使用reducemap。以您想要的格式获取数据是一个两阶段的过程。

首先,使用reduce以价格为键创建一个哈希表(因为您知道每个价格都是唯一的:

const obj = arr.reduce((p, c) => {

  // If price exists as a key its value by 1
  // otherwise set it to 1.
  p[c.price] = ++p[c.price] || 1;
  return p;
}, {});

输出

{
  "10": 4,
  "20": 2
}

就目前而言,您有一个非常好的对象,您可以通过键/价格访问它,我可能会停在那里:

obj['10'] // 4

但是,如果您想将该数据转换为问题中的格式,请map通过对象键返回一个新对象数组。

const out = Object.keys(obj).map(key => {
  return { price: +key, numElements: obj[key] };
});

演示

于 2017-08-07T16:06:29.353 回答
0
var hash = {}, result = [];

 arr.forEach(function(el){
   if(hash[el.price]){
     hash[el.price].numElements++;
   }else{
     result.push(hash[el.price]={price:el.price,numElements:1});
  }
});

可以使用哈希表进行价格查找。或使用 reduce 并找到:

 arr.reduce((res,{price})=>
  (( res.find(el=>el.price===price) || res[res.push({price,numElements:0})-1] )
  .numElements++,res)
);

于 2017-08-07T15:50:33.843 回答