Javascript 如何筛选对象数组并根据它们在数组中显示的次数对其排序
我有一个用户对象数组,其中一些出现多次。我试图计算每个唯一的用户对象在数组中出现的次数,并对它们进行重新排序,以使最常出现的用户在数组中位于第一位,而在数组中出现最少的用户在数组中位于最后Javascript 如何筛选对象数组并根据它们在数组中显示的次数对其排序,javascript,arrays,sorting,object,Javascript,Arrays,Sorting,Object,我有一个用户对象数组,其中一些出现多次。我试图计算每个唯一的用户对象在数组中出现的次数,并对它们进行重新排序,以使最常出现的用户在数组中位于第一位,而在数组中出现最少的用户在数组中位于最后 const users = [ {id: "0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8", handle: "lisa", email: "lisa@gmail.com", createdAt: 15938943
const users =
[
{id: "0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8", handle: "lisa", email: "lisa@gmail.com", createdAt: 1593894321997},
{id: "bbfc927c-f3d4-4cdd-b872-9cb233a194aa", handle: "jisoo", email: "jisoo@gmail.com", createdAt: 1592452421714},
{id: "be942039-6a59-46a4-9f92-1f7808b20c2f", handle: "unnieJennie", email: "jennie@gmail.com", createdAt: 1593894227232},
{id: "0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8", handle: "lisa", email: "lisa@gmail.com", createdAt: 1593894321997},
{id: "1d1e31cd-eff2-47de-b46d-4d45bb2dd97f", handle: "kawikaLovesKpop", email: "kawika@gmail.com", createdAt: 1593894550566},
{id: "be942039-6a59-46a4-9f92-1f7808b20c2f", handle: "unnieJennie", email: "jennie@gmail.com", createdAt: 1593894227232},
{id: "0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8", handle: "lisa", email: "lisa@gmail.com", createdAt: 1593894321997},
{id: "1d1e31cd-eff2-47de-b46d-4d45bb2dd97f", handle: "kawikaLovesKpop", email: "kawika@gmail.com", createdAt: 1593894550566},
{id: "be942039-6a59-46a4-9f92-1f7808b20c2f", handle: "unnieJennie", email: "jennie@gmail.com", createdAt: 1593894227232}
]
我试过用lodash的countBy方法
const bestMatched = countBy(users, "handle");
返回
{lisa: 3, jisoo: 1, unnieJennie: 3, kawikaLovesKpop: 2}
我仍然需要访问包含所有对象键和值的用户数组。尝试以下操作:
let counterObj={}
for(用户中的用户){
counterObj[user.handle]=1+(counterObj[user.handle]| | 0)
}
console.log(counterObj)
const用户=
[
{id:“0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8”,句柄:“lisa”,电子邮件:lisa@gmail.com“,createdAt:1593894321997},
{id:“bbfc927c-f3d4-4cdd-b872-9cb233a194aa”,句柄:“jisoo”,电子邮件:jisoo@gmail.com“,createdAt:1592452421714},
{id:“be942039-6a59-46a4-9f92-1f7808b20c2f”,句柄:“unnieJennie”,电子邮件:jennie@gmail.com“,createdAt:1593894227232},
{id:“0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8”,句柄:“lisa”,电子邮件:lisa@gmail.com“,createdAt:1593894321997},
{id:“1d1e31cd-eff2-47de-b46d-4d45bb2dd97f”,句柄:“kawikaLovesKpop”,电子邮件:kawika@gmail.com“,createdAt:1593894550566},
{id:“be942039-6a59-46a4-9f92-1f7808b20c2f”,句柄:“unnieJennie”,电子邮件:jennie@gmail.com“,createdAt:1593894227232},
{id:“0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8”,句柄:“lisa”,电子邮件:lisa@gmail.com“,createdAt:1593894321997},
{id:“1d1e31cd-eff2-47de-b46d-4d45bb2dd97f”,句柄:“kawikaLovesKpop”,电子邮件:kawika@gmail.com“,createdAt:1593894550566},
{id:“be942039-6a59-46a4-9f92-1f7808b20c2f”,句柄:“unnieJennie”,电子邮件:jennie@gmail.com“,createdAt:1593894227232}
]
ob={lisa:3,jisoo:1,unnieJennie:3,kawikaLovesKpop:2}
map=newmap()
users.map(x=>map.set(x.handle,x))
res=Object.entries(ob.sort)((a,b)=>b[1]-a[1])
.flatMap(o=>Array(o[1]).fill(map.get(o[0]))
console.log(res)
您可以按位执行此操作,因为~undefined=-1
需要一个对象来存储结果:
const result = users.reduce((m,{handle})=>({...m, [handle]:-~m[handle]}), {})
试试看:
const用户=
[
{id:“0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8”,句柄:“lisa”,电子邮件:lisa@gmail.com“,createdAt:1593894321997},
{id:“bbfc927c-f3d4-4cdd-b872-9cb233a194aa”,句柄:“jisoo”,电子邮件:jisoo@gmail.com“,createdAt:1592452421714},
{id:“be942039-6a59-46a4-9f92-1f7808b20c2f”,句柄:“unnieJennie”,电子邮件:jennie@gmail.com“,createdAt:1593894227232},
{id:“0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8”,句柄:“lisa”,电子邮件:lisa@gmail.com“,createdAt:1593894321997},
{id:“1d1e31cd-eff2-47de-b46d-4d45bb2dd97f”,句柄:“kawikaLovesKpop”,电子邮件:kawika@gmail.com“,createdAt:1593894550566},
{id:“be942039-6a59-46a4-9f92-1f7808b20c2f”,句柄:“unnieJennie”,电子邮件:jennie@gmail.com“,createdAt:1593894227232},
{id:“0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8”,句柄:“lisa”,电子邮件:lisa@gmail.com“,createdAt:1593894321997},
{id:“1d1e31cd-eff2-47de-b46d-4d45bb2dd97f”,句柄:“kawikaLovesKpop”,电子邮件:kawika@gmail.com“,createdAt:1593894550566},
{id:“be942039-6a59-46a4-9f92-1f7808b20c2f”,句柄:“unnieJennie”,电子邮件:jennie@gmail.com“,createdAt:1593894227232}
]
const result=users.reduce((m,{handle})=>({…m,[handle]:-~m[handle]}),{})
log({result})
我相信这可能就是您想要的。JSON中也有一些错误,但现在应该可以了
const users = [
{
id: '0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8',
handle: 'lisa',
email: 'lisa@gmail.com',
createdAt: 1593894321997,
},
{
id: 'bbfc927c-f3d4-4cdd-b872-9cb233a194aa',
handle: 'jisoo',
email: 'jisoo@gmail.com',
createdAt: 1592452421714,
},
{
id: 'be942039-6a59-46a4-9f92-1f7808b20c2f',
handle: 'unnieJennie',
email: 'jennie@gmail.com',
createdAt: 1593894227232,
},
{
id: '0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8',
handle: 'lisa',
email: 'lisa@gmail.com',
createdAt: 1593894321997,
},
{
id: '1d1e31cd-eff2-47de-b46d-4d45bb2dd97f',
handle: 'kawikaLovesKpop',
email: 'kawika@gmail.com',
createdAt: 1593894550566,
},
{
id: 'be942039-6a59-46a4-9f92-1f7808b20c2f',
handle: 'unnieJennie',
email: 'jennie@gmail.com',
createdAt: 1593894227232,
},
{
id: '0f933bbd-d1fb-4ad5-80f0-661c3c0aa2f8',
handle: 'lisa',
email: 'lisa@gmail.com',
createdAt: 1593894321997,
},
{
id: '1d1e31cd-eff2-47de-b46d-4d45bb2dd97f',
handle: 'kawikaLovesKpop',
email: 'kawika@gmail.com',
createdAt: 1593894550566,
},
{
id: 'be942039-6a59-46a4-9f92-1f7808b20c2f',
handle: 'unnieJennie',
email: 'jennie@gmail.com',
createdAt: 1593894227232,
},
];
function sort(jsonArray) {
var containerArray = [];
jsonArray.map((item, index) => {
if (item === 'null') {
} else {
var newArray = [];
var itemHandle = item.handle;
jsonArray.map((i, index) => {
if (itemHandle === i.handle && itemHandle !== 'null') {
newArray.push(i);
jsonArray.splice(index, 1, 'null');
}
});
jsonArray.splice(index, 1, 'null');
containerArray.push(newArray);
}
});
return containerArray;
}
var finalArray = sort(users);
//Sorts the finalArray by highest occurrence to lowest
finalArray.sort(function(a,b){
return b.length - a.length
})
console.log(finalArray)
将对象放在一起,以便您仍然可以通过点符号访问它们的属性。感谢您的快速响应!这也会返回与上面countBy方法相同的解决方案:``{lisa:3,jisoo:1,unnieJennie:3,kawikaLovesKpop:2}``我正试图返回另一个数组,其中用户“lisa”和“unnieJennie”出现了3次,接下来是“kawika”,因为他出现了两次,还有“jisoo”最后,她出现一次。~在那里做什么?@MoHradA基本上,我们将初始化一个对象
{}
,然后我们将计算每个元素的出现次数,如果键之前不存在(未定义),那么它应该是1(按位不,我们可以这样做~undefined=-1和-~undefined=1),如果密钥存在,那么它应该是前面的+1个密钥,这很好。由于OP想要对结果进行排序,我建议添加逻辑数组循环是一种非常糟糕的做法。此外,您似乎还使用了“地图”,其中“查找”或“forEach”更为实用。仅使用map()创建循环也是一个糟糕的方法practice@charlietfl应使用什么来代替拼接?