如何通过嵌套对象内部的特定键对对象的嵌套数组进行排序?

时间:2019-05-16 18:24:14

标签: javascript arrays

我有一个嵌套的对象数组,看起来像这样:

mainArray = [
   { name: 'a',age: 10, details: [ { desc: 'test1' , score: 6 }, { desc: 'testa' , score: 10 }] },
   { name: 'b',age: 20, details: [ { desc: 'test2' , score: 30 }, { desc: 'testb' , score: 34 }] },
   { name: 'c',age: 40, details: [ { desc: 'test3' , score: 40 }, { desc: 'testc' , score: 7 }] }
]

我要做的是根据得分对mainArray进行排序:

  1. 首先,我想按降序对细节数组进行排序(最高分在前)
  2. 然后按降序对mainArray进行排序(最高分在前)
  3. 此外,在某些情况下,详细信息在数组中仅包含一项

这是我想要的结果:

mainArray = [ 
   { name: 'c',age: 40, details: [ { desc: 'test3' , score: 40 }, { desc: 'testc' , score: 7 } ] }
   { name: 'b',age: 20, details: [ { desc: 'test2' , score: 34 }, { desc: 'testb' , score: 30 } ] }
   { name: 'a',age: 10, details: [ { desc: 'test1' , score: 20 }, { desc: 'testa' , score: 6 } ] }
]

我尝试过的是将整个主数组弄平,然后按分数排序。但我正在寻找一种更有效的解决方案。我也喜欢lodash等或vanillajs这样的库

4 个答案:

答案 0 :(得分:0)

首先对内部数组进行排序,然后最高值将位于第一个位置,然后对外部数组进行排序:

  for(const { details } of mainArray)
    details.sort((a, b) => b.score - a.score);

 mainArray.sort((a, b) => b.details[0].score - a.details[0].score);

答案 1 :(得分:0)

两个分类都需要分类功能。然后,您需要为每个array元素的每个details元素调用前一个,最后在对mainArray进行排序时,您需要根据第一个得分进行排序

var sortHighest = function(a,b) {
  return a.score - b.score;
}

var sortFunc = function(a,b) {
  return a.details[0].score - b.details[0].score;
}

mainArray.forEach(function(item) {
  details.sort(sortHighest);
}

mainArray.sort(sortFunc);

答案 2 :(得分:0)

首先遍历所有对象并sort它们的details数组:

mainArray.forEach(obj => obj.details.sort((a, b) => b.score - a.score));

然后通过比较sort数组中的第一个scoredetails数组本身:

mainArray.sort((a, b) => b.details[0].score - a.details[0].score);

示例:

let mainArray = [
   { name: 'a',age: 10, details: [ { desc: 'test1' , score: 6 }, { desc: 'testa' , score: 10 }] },
   { name: 'b',age: 20, details: [ { desc: 'test2' , score: 30 }, { desc: 'testb' , score: 34 }] },
   { name: 'c',age: 40, details: [ { desc: 'test3' , score: 40 }, { desc: 'testc' , score: 7 }] }
];

mainArray.forEach(obj => obj.details.sort((a, b) => b.score - a.score));
mainArray.sort((a, b) => b.details[0].score - a.details[0].score);

console.log(mainArray);

答案 3 :(得分:0)

您可以使用Array.sort()完成此操作。

首先对mainArray.details数组进行排序,然后对mainArray进行排序。

请参见以下示例:

mainArray.forEach(function(elem) {
  elem.details.sort(function(a, b) {
    return b.score - a.score;
  })
})

mainArray.sort(function(a, b) {
  return b.details[0].score - a.details[0].score;
})

console.log(mainArray);
<script>
  mainArray = [
   { name: 'a',age: 10, details: [ { desc: 'test1' , score: 6 }, { desc: 'testa' , score: 10 }] },
   { name: 'b',age: 20, details: [ { desc: 'test2' , score: 30 }, { desc: 'testb' , score: 34 }] },
   { name: 'c',age: 40, details: [ { desc: 'test3' , score: 40 }, { desc: 'testc' , score: 7 }] }
]
</script>