计算字典中的项目数

时间:2019-03-04 11:04:43

标签: javascript

我有一个简单的问题,但是解决方案对我来说并不简单。 基本上,我确实有一个带有状态对象的数组。

status = [ {status:1, id:10},
           {status:2, id:11},
           {status:1, id:12}]

我现在要一次性计算状态为1的所有对象。所以我的最终结果应该是这样的:

[ [1,2], [2,1]]

我已经有这个了,但是最新的步骤对我总是失败:

items = status.map(function(x){return x.status})
unique = new Set(items)

然后我被困住了。

在python中,我知道该怎么做,但这不是目前的选择。

// this is the python code 
items = [x["status"] for x in status]
[ [x, items.count(x)] for x in set(items)]

4 个答案:

答案 0 :(得分:5)

您可以使用Map来获取Array.from和键/值对的数组。

顺便说一句,您需要将全局status重命名为其他名称,因为window.status是为用户代理的状态消息保留的字符串。

var array = [{ status: 1, id: 10 }, { status: 2, id: 11 }, { status: 1, id: 12 }],
    result = Array.from(array.reduce(
        (m, { status }) => m.set(status, (m.get(status) || 0) + 1),
        new Map
    ));

console.log(result);

答案 1 :(得分:1)

const status = [
  {status:1, id:10},
  {status:2, id:11},
  {status:1, id:12}
];
const statuses = [];
const result = [];

status.map(s => {
    if (statuses.indexOf(s.status) === -1) {
    result.push([ s.status, status.filter(i => i.status === s.status ).length ]);
    statuses.push(s.status);
  }
});

console.log(result);

答案 2 :(得分:0)

您可以只使用一个简单的reduce,然后使用条目获取所需的格式:)

const status = [ {status:1, id:10},
           {status:2, id:11},
           {status:1, id:12}];
           
const result = status.reduce((acc, {status}) => (acc[status] = (acc[status] || 0) + 1, acc), {});
console.log(result);

const formattedResult = Object.entries(result)
console.log(formattedResult);

// If you need to remove the string format from the keys: 

const formattedResult2 = Object.entries(result).map(([k,v]) => [Number(k),v]);
console.log(formattedResult2);

答案 3 :(得分:0)

由于对象也是可接受的答案(如上面的注释中所述),您也可以只使用reduce并将数据包装在新对象中:

var arr = [ {status:1, id:10},
           {status:2, id:11},
           {status:1, id:12}];
           
console.log(
   arr.reduce((a, {status}) => {
  	if (a[status]) a[status]++;
        else a[status] = 1;
        return a;
  }, {})
)

尽管上面的内容很容易阅读,但是您仍然可以减少完成任务的步骤。如果在“ a”(开头是空对象)中,该状态已经存在,则将其增加。否则,将其设置为1并继续直到阵列完全循环。

{status}(第二个参数)获取当前循环对象的status键值,等效于item.status

相关问题