Sorting array of objects matching ids on a different set

自闭症网瘾萝莉.ら 提交于 2019-12-11 03:14:56

问题


I have an array of objects

array = [
    {id: 5, name: "Helen", age: 20}, 
    {id: 15, name: "Lucy", age: 30}, 
    {id:7, name: "Carlos", age: 1}
]

Then I have a similar array sorted differently

arraySorted = [        
    {id: 15, name: "Lucy", age: 2}, 
    {id: 5, name: "Lara", age: 11}, 
    {id:7, name: "Carlos", age: 10}
]

The ids of the objects on both arrays will always match, the rest of the properties may or may not.

What I need is sorting the array in the same id order as arraySorted.

(it can be also done on plain JavaScript, lodash is not necessary but maybe it will be useful)


回答1:


Rather than sort, use map, find and Object.assign instead

arraySorted.map( s => Object.assign( s, array.find( t => t.id == s.id ) ) );

Demo

var array = [{
    id: 5,
    name: "Helen",
    age: 20
  },
  {
    id: 15,
    name: "Lucy",
    age: 30
  },
  {
    id: 7,
    name: "Carlos",
    age: 1
  }
];
var arraySorted = [{
    id: 15,
    name: "Lucy",
    age: 2
  },
  {
    id: 5,
    name: "Lara",
    age: 11
  },
  {
    id: 7,
    name: "Carlos",
    age: 10
  }
];
array = arraySorted.map(s => Object.assign(s, array.find(t => t.id == s.id)));

console.log(array);



回答2:


See Map and Array.prototype.map() for more info.

// Raw.
const raw = [
    {id: 5, name: "Helen", age: 20}, 
    {id: 15, name: "Lucy", age: 30}, 
    {id:7, name: "Carlos", age: 1}
]

// Sorted.
const sorted = [        
    {id: 15, name: "Lucy", age: 2}, 
    {id: 5, name: "Lara", age: 11}, 
    {id:7, name: "Carlos", age: 10}
]

// Match.
const match = (raw, sorted) => (m => sorted.map(s => m.get(s.id)))(new Map(raw.map(r => [r.id, r])))

// Output.
const output = match(raw, sorted)

// Proof.
console.log(output)



回答3:


The new array can be obtained via Array.prototype.map:

const newArray = arraySorted.map(sortedItem => 
  array.find(item => item.id === sortedItem.id)
)

console.log(newArray)



回答4:


You can use a Map, and avoid using nested iteration methods (like find, which make the solution have a worse time complexity), assuming that indeed you have all the same id values in both arrays:

const array = [{id: 5, name: "Helen", age: 20}, {id: 15, name: "Lucy", age: 30}, {id:7, name: "Carlos", age: 1}],
    arraySorted = [{id: 15, name: "Lucy", age: 2},{id: 5, name: "Lara", age: 11},{id:7, name: "Carlos", age: 10}]

const result = arraySorted.map((map => row => array[map.get(row.id)])
                               (new Map(array.map((row, i) => [row.id, i]))));

console.log(result);



回答5:


Try this, hope this helps

var array=[{id:5,name:"Helen",age:20},{id:15,name:"Lucy",age:30},{id:7,name:"Carlos",age:1}];

var arraySorted=[{id:15,name:"Lucy",age:2},{id:5,name:"Lara",age:11},{id:7,name:"Carlos",age:10}];

array = arraySorted.map(s => array.find(t => t.id == s.id));

console.log(array);



回答6:


You can use Map to sort your array:

let a1 = [{id: 5, name: "Helen", age: 20}, {id: 15, name: "Lucy", age: 30}, {id:7, name: "Carlos", age: 1}],
    a2 = [{id: 15, name: "Lucy", age: 2}, {id: 5, name: "Lara", age: 11}, {id:7, name: "Carlos", age: 10}];

let map = ((m) => (
             a2.forEach(({id}) => m.set(id, a1.find(o => o.id === id))), m
          ))(new Map());

let result = [...map.values()];

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


来源:https://stackoverflow.com/questions/49528252/sorting-array-of-objects-matching-ids-on-a-different-set

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!