对包含两个对象的数组进行排序

Sort Array with two object inside

我想问一下 array.sort() 正在寻找有关此类问题的解决方案如何对具有这种结构的数组进行排序

  array.sort((a, b) => a.foo.foo1.foo2 - b.foo.foo1.foo2)

这是有效的,但在为多个用例重写代码之后

export const handleSort = (arr, sortBy, desc) => {
 arr = [...arr];

   if (desc) {
     return arr.sort((a, b) => b[sortBy] - a[sortBy]);
   } else {
     return arr.sort((a, b) => a[sortBy] - b[sortBy]);
   }

稍后如果我需要的话

  return arr.sort((a, b) => b[sortBy][0][1] - a[sortBy][0][1]);

我不能用这个

也许一个好主意是定义一个函数来处理获取属性以进行比较?

const handleSort = (arr, desc, getValue) => {
  if (desc) {
    return arr.sort((a,b) => getValue(a) - getValue(b));
  } 

  return arr.sort((a,b) => getValue(b) - getValue(a));

}

这样,你就可以像这样使用upper函数:

return handleSort(myArray, true, (obj) => obj.foo.foo1.foo2);

您可以使用一个函数和一个数组来获得正确的 属性。

const
    getValue = (object, keys) => keys?.length
        ? keys.reduce((o, k) => o[k], object)
        : object,
    ASC = (a, b) => a - b,
    DESC = (a, b) => b - a,
    sortBy = (order, keys) => (a, b) => order(getValue(a, keys), getValue(b, keys)),
    keys = ['foo', 'foo1', 'foo2'],
    data = [{ foo: { foo1: { foo2: 7 } } }, { foo: { foo1: { foo2: 2 } } }, { foo: { foo1: { foo2: 9 } } }, { foo: { foo1: { foo2: 6 } } }, { foo: { foo1: { foo2: 1 } } }, { foo: { foo1: { foo2: 4 } } }];

// usage
data.sort(sortBy(ASC, keys)); 

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