我有一个包含ID和名称的对象数组。
var array = [ {'id':1, 'name': Bob}, {'id':1, 'name': Bob}, {'id':1, 'name': Bob}, {'id':2, 'name': Jeff}, {'id':1, 'name': Bob}, {'id':2, 'name': Jeff}, ]
使用
var result = array.reduce((ac, p) => ({
...ac, [p.product_name]: (ac[p.product_name] || 0) + 1
}),{})
我会得到
{Bob: 4, Jeff: 2}
我该怎么做才能使函数返回
[{name: "Bob", frequency: 4}, {name: "Jeff", frequency: 2}]
答案 0 :(得分:1)
与findIndex
一起使用reduce
findIndex将获得名称匹配的数组中对象的索引。如果不是-1
,则不存在名称值与数组匹配的任何对象。如果存在,则更新频率键的值
var arrays = [{
'id': 1,
'name': 'Bob'
}, {
'id': 1,
'name': 'Bob'
}, {
'id': 1,
'name': 'Bob'
}, {
'id': 2,
'name': 'Jeff'
}, {
'id': 1,
'name': 'Bob'
}, {
'id': 2,
'name': 'Jeff'
}]
let newArray = arrays.reduce(function(acc, curr, index) {
let getIndex = acc.findIndex(function(item) {
return item.name === curr.name;
})
if (getIndex === -1) {
acc.push({
name: curr.name,
frequency: 1
})
} else {
acc[getIndex].frequency = acc[getIndex].frequency + 1
}
return acc;
}, [])
console.log(newArray)
答案 1 :(得分:0)
遍历数组,将特定属性存储在对象中,添加新对象或增加数组中的数字。
您似乎想编写简短的代码,但我选择了使该函数更具动态性的自由。
var result = function(arr, firstProperty, secondProperty) {
var reducedArr = [];
var tempObj = {};
var currentArrIndex = 0;
var firstPropertyValue = '';
secondProperty = secondProperty || 'frequency';
for (var i = 0; i < arr.length; i++) {
firstPropertyValue = arr[i][firstProperty];
if (firstPropertyValue) {
if (tempObj.hasOwnProperty(firstPropertyValue)) {
currentArrIndex = tempObj[firstPropertyValue];
reducedArr[currentArrIndex][secondProperty] += 1;
} else {
currentArrIndex = reducedArr.length
tempObj[firstPropertyValue] = currentArrIndex;
reducedArr[currentArrIndex] = {};
reducedArr[currentArrIndex][firstProperty] = arr[i][firstProperty];
reducedArr[currentArrIndex][secondProperty] = 1;
}
}
}
return reducedArr;
}
// EXAMPLES
// result(arrays, 'name')
// result(arrays, 'id')
// result(arrays, 'id, 'occurrancies')