我想按另一个数组顺序对对象进行排序

时间:2020-08-03 05:38:25

标签: javascript arrays object

①有一个这样的数组。

const array = ['a', 'b', 'c', 'd', 'E'];

②有一个物体。

const obj = {
  'b': ['aa', 'bb', 'cc'],
  'a': ['ac', 'bc', 'cs'],
  'c': ['as', 'b', 'c_1'],
  'E': ['a_4', 'b_4', 'c_4'],
  'd': ['a_4', 'b_4', 'c_4']
};

当您要按照①的排列顺序重新排列它们时。

我希望结果是这样的。

const obj = {
  'a': ['ac', 'bc', 'cs'],
  'b': ['aa', 'bb', 'cc'],
  'c': ['as', 'b', 'c_1'],
  'd': ['a_4', 'b_4', 'c_4'],
  'E': ['a_4', 'b_4', 'c_4']
};

是否可以仅使用map函数进行排序?

2 个答案:

答案 0 :(得分:1)

使用indexOf()reduce()

const array = ['a', 'b', 'c', 'd', 'E'];

const obj = {
  'b': ['aa', 'bb', 'cc'],
  'a': ['ac', 'bc', 'cs'],
  'c': ['as', 'b', 'c_1'],
  'E': ['a_4', 'b_4', 'c_4'],
  'd': ['a_4', 'b_4', 'c_4']
};

// console.log(JSON.stringify(obj))

const res = Object.keys(obj)
    .sort((a, b) => array.indexOf(a) - array.indexOf(b))
    .reduce((a, k) => ({...a, [k]: obj[k] }), {})

console.log(JSON.stringify(res))

使用Object.fromEntries()Object.entries()

const array = ['a', 'b', 'c', 'd', 'E'];

const obj = {
  'b': ['aa', 'bb', 'cc'],
  'a': ['ac', 'bc', 'cs'],
  'c': ['as', 'b', 'c_1'],
  'E': ['a_4', 'b_4', 'c_4'],
  'd': ['a_4', 'b_4', 'c_4']
};

// console.log(JSON.stringify(obj))

const res = Object.fromEntries(Object.entries(obj)
    .sort((a, b) => array.indexOf(a[0]) - array.indexOf(b[0])))

console.log(JSON.stringify(res))

答案 1 :(得分:0)

我认为我们不需要排序,因为我们的目标是按照 array 排列 obj

const array = ['a', 'b', 'c', 'd', 'E'];
const obj = {
  'b': ['aa', 'bb', 'cc'],
  'a': ['ac', 'bc', 'cs'],
  'c': ['as', 'b', 'c_1'],
  'E': ['a_4', 'b_4', 'c_4'],
  'd': ['a_4', 'b_4', 'c_4']
};

let result = array.reduce((accumulator, currentItem)=>{
    accumulator[currentItem] = obj[currentItem];
    return accumulator;
},{});

console.log(result)