如何计算匿名对象数组中属性值的出现次数

时间:2016-10-11 14:19:55

标签: javascript jquery arrays

我希望找到一个有效的答案,如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。

4 个答案:

答案 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#reduceArray#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>