按唯一键

时间:2017-05-02 16:16:07

标签: javascript arrays

[
  {
    assigned_user:{
            name:'Paul',
            id: 34158
        },
    doc_status: "processed"
  },
  {
      assigned_user:{
            name:'Simon',
            id: 48569
        },
    doc_status: "processed"
  },
  {
      assigned_user:{
            name:'Simon',
            id: 48569
        },
    doc_status: "processed"
  }
];

我们说我有上面的数组。

我正在寻找一个可以计算我们遇到每个unqiue用户多少次的函数,然后将结果推送到另一个数组中:

所以,我希望得到这样的东西:

[
  {
    user:"Simon",
    count: 2
  },
  {
    user: "Paul",
    count: 1
  }
];

有什么想法吗?

我尝试通过接受所有独特用户来解决,然后计算每个用户出现在我的阵列中的时间,但我无法解决这个问题。

4 个答案:

答案 0 :(得分:0)

Ecmascript5 解决方案(Array.prototype.reduce()Array.prototype.map()函数):



var arr = [
        {assigned_user:{name:'Paul',id: 34158},doc_status: "processed"}, {assigned_user:{name:'Simon',id: 48569},doc_status: "processed"}, {assigned_user:{name:'Simon',id: 48569},doc_status: "processed"}
    ];

var counts = arr.reduce(function (r, o) {
    var user = o.assigned_user.name;     // getting reference to username
    (r[user])? ++r[user] : r[user] = 1;  // accumulating username occurrences
    return r;
}, {}),
    // costructing the final structure `user`:`count`
    result = Object.keys(counts).map(function (k) {
        return {user: k, count: counts[k]};
    });

console.log(result);




答案 1 :(得分:0)

const a = [{assigned_user:{name:'Paul',id: 34158},doc_status: "processed"},{assigned_user:{name:'Simon',id: 48569},doc_status: "processed"},{assigned_user:{name:'Simon',id: 48569},doc_status: "processed"}];

const b = [...new Set(a.map(x => x.assigned_user.name))]
	.map(x => Object.assign({}, {user: x, count: a.filter(e => e.assigned_user.name === x).length}))
  
console.log(JSON.stringify(b, null, 2))

答案 2 :(得分:0)

您可以使用哈希表作为对用户计数的引用。

然后迭代给定的数组并检查哈希表是否包含用户对象。如果没有创建一个并将对象推送到结果集。

增加用户在哈希表对象上的计数。

稍后,您可以在顶部对顶部计数排序结果数组。



var data = [{ assigned_user: { name: 'Paul', id: 34158 }, doc_status: "processed" }, { assigned_user: { name: 'Simon', id: 48569 }, doc_status: "processed" }, { assigned_user: { name: 'Simon', id: 48569 }, doc_status: "processed" }],
    count = data.reduce(function (hash) {
        return function (r, a) {
            var user = a.assigned_user.name;
            if (!hash[user]) {
                hash[user] = { user: user, count: 0 };
                r.push(hash[user]);
            }
            hash[user].count++;
            return r;
        };
    }(Object.create(null)), []);


count.sort(function (a, b) { return b.count - a.count; });
console.log(count);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 3 :(得分:0)

您可以使用JSON.stringify().match()RegExp /("name":)"\w+(?=")/一起获取"name"来自对象.replace()的属性和值{{1} } RegExp删除属性名称; /["]|name":/g循环和for..of检查属性是否存在于对象中,如果不是Array.prototype.find()对象到数组,则增加.push()属性

"count"