我希望找到一个有效的答案,如Jquery Count number of occurances in array中的第二个答案(Rajesh Dhiman)
JQuery的Javascript都可以接受。
考虑:
var items = new Array();
items.push({x: 1, y: "what"});
items.push({x: 3, y: "ever"});
items.push({x: 4, y: "can"});
items.push({x: 4, y: "happen"});
items.push({x: 1, y: "will"});
items.push({x: 4, y: "happen"});
寻求结果(排序与否无关紧要):
res = {1:2, 3:1, 4:3}
我在这里找到的所有其他相关答案只考虑计算简单数组或JS / JQ。
答案 0 :(得分:4)
您可以使用reduce()
并返回对象作为结果。
var items = new Array();
items.push({x: 1, y: "what"});
items.push({x: 3, y: "ever"});
items.push({x: 4, y: "can"});
items.push({x: 4, y: "happen"});
items.push({x: 1, y: "will"});
items.push({x: 4, y: "happen"});
var result = items.reduce(function(r, o) {
r[o.x] = (r[o.x] || 0) + 1;
return r;
}, {})
console.log(result)

答案 1 :(得分:2)
不需要Array#reduce
,Array#forEach
效果很好。
结果是一个对象。引用不会改变,因此没有必要使用更改结果引用的内容。
如果,例如,结果是一个连续的加法,那么结果会改变,但是在这里,对象,它不会改变。通过减少移动物体更是某种懒惰。
var items = [{ x: 1, y: "what" }, { x: 3, y: "ever" }, { x: 4, y: "can" }, { x: 4, y: "happen" }, { x: 1, y: "will" }, { x: 4, y: "happen" }],
count = Object.create(null);
items.forEach(function(a) {
count[a.x] = (count[a.x] || 0) + 1;
});
console.log(count);
根据请求计数对象数组。此提案使用this
对象对结果集中包含的项进行哈希处理。
var items = [{ x: 1, y: "what" }, { x: 3, y: "ever" }, { x: 4, y: "can" }, { x: 4, y: "happen" }, { x: 1, y: "will" }, { x: 4, y: "happen" }],
result = [];
items.forEach(function(a) {
if (!this[a.x]) {
this[a.x] = { x: a.x, cnt: 0 };
result.push(this[a.x]);
}
this[a.x].cnt++;
}, Object.create(null));
console.log(result);
使用Array#reduce
,哈希表作为闭包和数组。
var items = [{ x: 1, y: "what" }, { x: 3, y: "ever" }, { x: 4, y: "can" }, { x: 4, y: "happen" }, { x: 1, y: "will" }, { x: 4, y: "happen" }],
result = items.reduce(function (hash) {
return function(r, a) {
if (!hash[a.x]) {
hash[a.x] = { x: a.x, cnt: 0 };
r.push(hash[a.x]);
}
hash[a.x].cnt++;
return r;
};
}(Object.create(null)), []);
console.log(result);
答案 2 :(得分:0)
快速排序的解决方案:
var items = new Array();
items.push({x: 1, y: "what"});
items.push({x: 3, y: "ever"});
items.push({x: 4, y: "can"});
items.push({x: 4, y: "happen"});
items.push({x: 1, y: "will"});
items.push({x: 4, y: "happen"});
var res = items.map(x => ({x: x.x})).sort((a,b) => a.x - b.x).reduce((r,o) => {
r[o.x] = (r[o.x] || 0) + 1;
return r;
}, {});
console.log(res); //{ '1': 2, '3': 1, '4': 3 }
答案 3 :(得分:0)
另一种方法是迭代它并找到事件。下面是代码和演示。
var items = new Array();
items.push({x: 1, y: "what"});
items.push({x: 3, y: "ever"});
items.push({x: 4, y: "can"});
items.push({x: 4, y: "happen"});
items.push({x: 1, y: "will"});
items.push({x: 4, y: "happen"});
var returnobj = {};
$.each(items, function(key, value) {
if (returnobj.hasOwnProperty([value['x']])) {
returnobj[value['x']] = returnobj[value['x']] + 1;
} else {
returnobj[value['x']] = 1;
}
});
console.log(returnobj);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>