Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何筛选对象数组并根据它们在数组中显示的次数对其排序_Javascript_Arrays_Sorting_Object - Fatal编程技术网

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应使用什么来代替拼接?