仅对数组中的一个值进行排序

7ivaypg9  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(266)

我如何总是把香蕉排在苹果之后?

arr = [
          { 'id' : 1, 'fruit' : 'apple' },
          { 'id' : 2, 'fruit' : 'banana' },
          { 'id' : 3, 'fruit' : 'custard' },
          { 'id' : 4, 'fruit' : 'banana' },
          { 'id' : 5, 'fruit' : 'apple' },
          { 'id' : 6, 'fruit' : 'custard' } 
        ];

预期:

arr = [
          { 'id' : 1, 'fruit' : 'apple' },
          { 'id' : 3, 'fruit' : 'custard' },
          { 'id' : 5, 'fruit' : 'apple' },
          { 'id' : 2, 'fruit' : 'banana' },
          { 'id' : 4, 'fruit' : 'banana' },
          { 'id' : 6, 'fruit' : 'custard' } 
        ];

所以香蕉应该总是出现在苹果之后,或者苹果应该排在香蕉之前。
这就是我尝试过的:

arr.sort(function(a, b) {
      return (a.fruit === 'banana') - (b.fruit === 'banana') 
})

但在本例中,香蕉总是在数组的末尾进行排序,这不是我想要的。所有“香蕉”项目应自动排序在最后一个“苹果”项目之后

q9yhzks0

q9yhzks01#

你可以简单地按 item2 (按字母顺序)。

arr.sort((a, b) => a.item2.localeCompare(b.item2));

这将根据以下内容按字母顺序排列所有记录: item2 .
但是,如果您希望执行最小数量的掉期,那么我建议您不要使用 sort ,但通过从两端开始使两个索引彼此接近来循环数组:

let arr = [
      { 'item1' : 1, 'item2' : 'apple' },
      { 'item1' : 2, 'item2' : 'banana' },
      { 'item1' : 3, 'item2' : 'custard' },
      { 'item1' : 4, 'item2' : 'banana' },
      { 'item1' : 5, 'item2' : 'apple' },
      { 'item1' : 6, 'item2' : 'custard' } 
];

let i = 0;
let j = arr.length-1;
while (true) {
    while (i < j && arr[i].item2 !== "banana") {
        i++;
    }
    while (i < j && arr[j].item2 !== "apple") {
        j--;
    }
    if (i >= j) {
        break;
    }
    [arr[i], arr[j]] = [arr[j], arr[i]]; // swap
    i++;
    j--;
}

console.log(arr);
1yjd4xko

1yjd4xko2#

这将在第一步中将阵列分成两部分: res[true] 包含所有“香蕉”元素和 res[false] 所有其他的。在第二步中,阵列 res[true].splice() -他被送进了监狱 res[false] 最后一个索引“apple”后的数组。

const arr = [
      { 'item1' : 1, 'item2' : 'apple' },
      { 'item1' : 2, 'item2' : 'banana' },
      { 'item1' : 3, 'item2' : 'custard' },
      { 'item1' : 4, 'item2' : 'banana' },
      { 'item1' : 5, 'item2' : 'apple' },
      { 'item1' : 6, 'item2' : 'custard' } 
    ];

let res=arr.reduce(
  (a,c)=>(a[c.item2==="banana"].push(c),a),
  {true:[],false:[]} );

let pos=res[false].map(e=>e.item2).lastIndexOf("apple")+1;
// in case "apple" was not found: simply copy arr:
res=pos?(res[false].splice(pos,0,...res[true]),res[false]):arr.slice(0);
console.log(res);
``` `res` 包含最终结果。

相关问题