我有一个简单的问题,但是解决方案对我来说并不简单。 基本上,我确实有一个带有状态对象的数组。
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)]
答案 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
。