简体   繁体   English

如何在 javascript 中按类型对数组分组进行排序?

[英]How do I sort an array grouping by type in javascript?

I'm having a problem with sorting an object.我在排序 object 时遇到问题。

Lets say my array looks like this:假设我的数组如下所示:

[{name:'a', type: 'letter', date:'30897887', active: true},
{name:'b', type: 'letter', date:'30897888', active: true},
{name:'c', type: 'number', date:'30897889', active: true},
{name:'d', type: 'letter', date:'30897890', active: false},
{name:'e', type: 'letter', date:'30897895', active: true},
{name:'f', type: 'number', date:'30897878', active: false},
{name:'g', type: 'letter', date:'30897823', active: true},
{name:'h', type: 'idk', date:'30897885456', active: true}]


I need to show the active and the not active ones by toggling the view, in this I've been successful.我需要通过切换视图来显示活动和非活动的,在这我已经成功了。
What's driving me insane is: I need to group them by type with a specific order.让我发疯的是:我需要按类型和特定顺序对它们进行分组。 I cannot wrap my head around a method.我无法理解一种方法。
Let's say the order should be "all the objects with type = number first, then idk, and letter at the end.".假设顺序应该是“首先是type = number的所有对象,然后是idk,最后是字母。”。
How can i do it?我该怎么做?

It isn't so elegant but here is an example if it can help you:它不是那么优雅,但如果它可以帮助你,这里有一个例子:

const array = [{name:'a', type: 'letter', date:'30897887', active: true},
{name:'b', type: 'letter', date:'30897888', active: true},
{name:'c', type: 'number', date:'30897889', active: true},
{name:'d', type: 'letter', date:'30897890', active: false},
{name:'e', type: 'letter', date:'30897895', active: true},
{name:'f', type: 'number', date:'30897878', active: false},
{name:'g', type: 'letter', date:'30897823', active: true},
{name:'h', type: 'idk', date:'30897885456', active: true}];

const types = ['idk', 'letter', 'number'];

let newArray = [];

types.forEach(type => {
  array.forEach(item => {
    if (item.type === type) {
      newArray = [...newArray, item];
    }
  })
});

You can use priority mapping and then sort the array using that map like below:您可以使用优先级映射,然后使用 map 对数组进行排序,如下所示:

let priority = {
  "letter": 1,
  "idk": 2,
  "number": 3
};

arr.sort((a, b) => priority[a.type] - priority[b.type])

 const arr = [{ name: 'a', type: 'letter', date: '30897887', active: true }, { name: 'b', type: 'letter', date: '30897888', active: true }, { name: 'c', type: 'number', date: '30897889', active: true }, { name: 'd', type: 'letter', date: '30897890', active: false }, { name: 'e', type: 'letter', date: '30897895', active: true }, { name: 'f', type: 'number', date: '30897878', active: false }, { name: 'g', type: 'letter', date: '30897823', active: true }, { name: 'h', type: 'idk', date: '30897885456', active: true } ] let priority = { "letter": 1, "idk": 2, "number": 3 }; arr.sort((a, b) => priority[a.type] - priority[b.type]) console.log(arr) priority = { "letter": 3, "idk": 2, "number": 1 }; arr.sort((a, b) => priority[a.type] - priority[b.type]) console.log(arr)
 .as-console-wrapper {height:100%}

function customSort(arr, order) {
  var result = [];
  order.forEach((type) => {
      result = [...result,...arr.filter((data) => data.type === type)]
    });
  return result
}

Use it like像这样使用它

customSort(data, ["letter", "number", "string"])

You can use compare function to define custom sorting order您可以使用比较 function 来定义自定义排序顺序

Try this:尝试这个:

 var items = [ {name:'a', type: 'letter', date:'30897887', active: true}, {name:'b', type: 'letter', date:'30897888', active: true}, {name:'c', type: 'number', date:'30897889', active: true}, {name:'d', type: 'letter', date:'30897890', active: false}, {name:'e', type: 'letter', date:'30897895', active: true}, {name:'f', type: 'number', date:'30897878', active: false}, {name:'g', type: 'letter', date:'30897823', active: true}, {name:'h', type: 'idk', date:'30897885456', active: true} ]; items.sort((item1,item2)=>{ if(item1.type === 'number'){ return -1; } if(item2.type === 'number'){ return 1; } if(item1.type === 'idk'){ return -2; } if(item2.type === 'idk'){ return 2; } }); console.log(items);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM