使用JavaScript对对象数组进行排序及按另一数组排序

3

我正在尝试通过与另一个对象进行比较来对对象数组进行排序。最终的数组需要将selected对象显示在顶部,其余对象显示在其下方。

虽然我已经得到了想要的输出,但是我想知道是否可以进一步优化它。

let myArray = [
    { Name: 'Name 1', id: 1111 },
    { Name: 'Name 2', id: 2222 },
    { Name: 'Name 3', id: 3333 },
    { Name: 'Name 4', id: 4444 },
    { Name: 'Name 5', id: 5555 },
    { Name: 'Name 6', id: 6666 }]

let selected = { 1111: 'some value 1', 4444: 'some value 2' }

sortBySelected = (data) => {
    var keys = Object.keys(selected);
    return data.filter((obj) => {
        if (keys.find((key) => {
            return key === String(obj.id);
        })) {
            return true;
        }
        return false;
    });
}

sortByNotSelected = (data) => {
    var keys = Object.keys(selected);
    return data.filter((obj) => {
        if (keys.find((key) => {
            return key === String(obj.id);
        })) {
            return false;
        }
        return true;
    });
}

sort = (data) => {
    data1 = sortBySelected(data);
    data2 = sortByNotSelected(data);
    return data1.concat(data2);
}


console.log(sort(myArray));

1
可工作的代码:https://codereview.stackexchange.com 有问题的代码:https://www.stackoverflow.com - Jamiec
选择的和未选择的项目是否也需要相互排序? - Salman A
顶部项目的期望顺序是什么?对象的顺序是按值排序的整数键。 - Nina Scholz
3个回答

3
您可以使用带有in运算符的检查数值的差值。

var array = [{ Name: 'Name 1', id: 1111 }, { Name: 'Name 2', id: 2222 }, { Name: 'Name 3', id: 3333 }, { Name: 'Name 4', id: 4444 }, { Name: 'Name 5', id: 5555 }, { Name: 'Name 6', id: 6666 }],
    selected = { 1111: 'some value 1', 4444: 'some value 2' };
    
array.sort((a, b) => (b.id in selected) - (a.id in selected));

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


你总是有最聪明的答案 <3 - JJJ

1
使用 Array.sort 进行排序。
myArray.sort(function(a, b) {
  var aSelected = selected[a.id] !== undefined;
  var bSelected = selected[b.id] !== undefined;
  if (aSelected && bSelected === false) {
    // a goes before b
    return -1;
  } else if (aSelected === false && bSelected) {
    // a goes after b
    return 1;
  } else {
    // a and b are considered equal...
    // let the sort function decide the actual position
    return 0;
  }
});

0

同时调用sortBySelected和sortByNotSelected会使JavaScript循环两次数组,使用Array.sort更加优雅,但似乎并不会减少成本。

我做了一个小的stackblitz示例来进行一些测试: https://stackblitz.com/edit/stackoverflow-48783794

sort函数是最初建议的函数,sort2是只循环1次而不是2次的函数,sort3使用Array.sort。

结果是相同的,sort2似乎更有效率(下面是结果图像链接):

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接