繁体   English   中英

根据另一个数组对对象数组进行排序

[英]Sort array of objects based on another array

我有一系列的make,如下所示:

const makes = [
{id: "4", name: "Audi"},
{id: "5", name: "Bmw"},
{id: "6", name: "Porsche"},
{id: "31", name: "Seat"},
{id: "32", name: "Skoda"},
{id: "36", name: "Toyota"},
{id: "38", name: "Volkswagen"}
]

我想基于另一个数组对该数组进行排序:

const preferred_makes = ['Volkswagen', 'Audi'];

我现在要做的如下:

const preferred_makes = ['Volkswagen', 'Audi'];

const makes = [
{id: "4", name: "Audi"},
{id: "5", name: "Bmw"},
{id: "6", name: "Porsche"},
{id: "31", name: "Seat"},
{id: "32", name: "Skoda"},
{id: "36", name: "Toyota"},
{id: "38", name: "Volkswagen"}
]

const mainMakes = []
const otherMakes = []

makes.map(make => _.includes(preferred_makes, make.name) ? mainMakes.push(make) : otherMakes.push(make))

console.log(mainMakes)
console.log(otherMakes)

但是还有更好的方法吗? 我可以对makes进行排序makes以将这些preferred_makes显示为数组的第一个元素吗?

这是小提琴。

您可以采用一个索引增加一个的对象,并为未找到的名称采用默认值Infinity 然后按值的增量排序。

 var preferred_makes = ['Volkswagen', 'Audi'], preferred = preferred_makes.reduce((o, k, i) => (o[k] = i + 1, o), {}); array = [{ id: "4", name: "Audi" }, { id: "5", name: "Bmw" }, { id: "6", name: "Porsche" }, { id: "31", name: "Seat" }, { id: "32", name: "Skoda" }, { id: "36", name: "Toyota" }, { id: "38", name: "Volkswagen" }]; array.sort((a, b) => (preferred[a.name] || Infinity) - (preferred[b.name] || Infinity)); console.log(array); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

具有自定义比较功能的常规array.sort()应该能够做到这一点。

 const preferred_makes = ['Volkswagen', 'Audi']; const makes = [ {id: "4", name: "Audi"}, {id: "5", name: "Bmw"}, {id: "6", name: "Porsche"}, {id: "31", name: "Seat"}, {id: "32", name: "Skoda"}, {id: "36", name: "Toyota"}, {id: "38", name: "Volkswagen"} ] const sorted = makes.slice().sort((a, b) => { // Convert true and false to 1 and 0 const aPreferred = new Number(preferred_makes.includes(a.name)) const bPreferred = new Number(preferred_makes.includes(b.name)) // Return 1, 0, or -1 return bPreferred - aPreferred }) console.log(sorted) 

您可以使用reduce来创建两个数组,而无需进行排序:

 const preferred_makes = ['Volkswagen','Audi']; const makes = [{id:"4",name:"Audi"},{id:"5",name:"Bmw"},{id:"6",name:"Porsche"},{id:"31",name:"Seat"},{id:"32",name:"Skoda"},{id:"36",name:"Toyota"},{id:"38",name:"Volkswagen"}]; const [mainMakes, otherMakes] = makes.reduce(([a, b], { id, name }) => ((preferred_makes.includes(name) ? a : b).push({ id, name }), [a, b]), [[], []]); console.log(mainMakes); console.log(otherMakes); 
 .as-console-wrapper { max-height: 100% !important; top: auto; } 

为了使其更快,您可以设置Set.prototype.has而不是includes

 const preferred_makes = new Set(['Volkswagen','Audi']); const makes = [{id:"4",name:"Audi"},{id:"5",name:"Bmw"},{id:"6",name:"Porsche"},{id:"31",name:"Seat"},{id:"32",name:"Skoda"},{id:"36",name:"Toyota"},{id:"38",name:"Volkswagen"}]; const [mainMakes, otherMakes] = makes.reduce(([a, b], { id, name }) => ((preferred_makes.has(name) ? a : b).push({ id, name }), [a, b]), [[], []]); console.log(mainMakes); console.log(otherMakes); 
 .as-console-wrapper { max-height: 100% !important; top: auto; } 

您也可以按Array.indexOf排序(如果有索引),否则使用String.localeCompare 真正不需要lodash:

 const makes = [ {id: "4", name: "Audi"}, {id: "6", name: "Porsche"}, {id: "31", name: "Seat"}, {id: "32", name: "Skoda"}, {id: "5", name: "Bmw"}, {id: "36", name: "Toyota"}, {id: "38", name: "Volkswagen"} ] const list = ['Volkswagen', 'Audi']; let result = makes.sort((a,b) => { let i = list.indexOf(a.name) return i < 0 ? a.name.localeCompare(b.name) : list.indexOf(b.name) - i }) console.log(result) 

使用lodash,您可以使用_.invert()通过汽车的品牌( indexByMake )生成原始index的字典,以获取{ [car make]: original array index } ,并将值映射回数字。

使用_.orderBy()对数组进行排序,并根据name使用indexByMake的值:

 const preferred_makes = ['Volkswagen', 'Audi']; const array = [{ id: "4", name: "Audi" }, { id: "5", name: "Bmw" }, { id: "6", name: "Porsche" }, { id: "31", name: "Seat" }, { id: "32", name: "Skoda" }, { id: "36", name: "Toyota" }, { id: "38", name: "Volkswagen" }]; const indexByMake = _.mapValues(_.invert(preferred_makes), Number); const result = _.sortBy(array, ({ name }) => indexByMake[name]); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script> 

暂无
暂无

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

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