javascript 使用动态键对嵌套对象数组进行排序

zqdjd7g9  于 2023-01-01  发布在  Java
关注(0)|答案(3)|浏览(165)

我正在尝试创建一个排序函数,在动态地(以不同的深度)给出一个键的同时,对嵌套的对象数组进行排序。

sortByKey(array, key){
    var splitKey = key.split(".");
    if(splitKey.length = 2){
      return array.sort(function(a, b) {
        var x = a[splitKey[0]][splitKey[1]]; var y = b[splitKey[0]][splitKey[1]];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
      });
    } else {
      return array.sort(function(a, b) {
        var x = a[key]; var y = b[key];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
      });
    }
  }

我想去掉if - else,用for循环代替。目标是函数可以使用“name”、“name.first”和“name.first.another”(作为示例)。有没有办法动态地完成这个任务?
换句话说,我想对不同的数组使用相同的函数,所以对于一个数组,我想调用sortByKey(array1,'name'),然后调用另一个sortByKey(array2,'location.address'),也许还有第三个sortByKey(array3,' location.address.postcode'),或者类似的东西。

iyfjxgzm

iyfjxgzm1#

提取属性提取函数

function prop(key) {
  var keys = key.split('.');

  return keys.reduce.bind(keys, function(obj, name) {
    return obj[name]
  })
}

并使用它来很好地提取值:)

sortByKey(array, key){
    var getKey = prop(key);

    return array.sort(function(a, b){
      var x = getKey(a); var y = getKey(b);
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    })
  }
jjhzyzn0

jjhzyzn02#

我想你的意思是这样的:

function sortByKey(array, key){
    var splitKey = key.split(".");

    return array.sort(function(a, b) {
        var ta = a;
        var tb = b;
        for (var i=0; i<splitKey.length; i++) {
            ta = ta[splitKey[i]];
        };
        /// return ((a < b) ? -1 : ((a > b) ? 1 : 0)); // Too complex ;-)
        return a - b;

    });

};
hvvq6cgz

hvvq6cgz3#

你的问题是一个误用的赋值语句,它应该是一个比较。

if (splitKey.length === 2) {
//                  ^^^

较短的方法可以使用Array#reduce

function sortByKey(array, key) {
    var getValue = function (o, k) { return o[k]; },
        keys = key.split(".");

    return array.sort(function (a, b) {
        return keys.reduce(getValue, a) - keys.reduce(getValue, b);
    });
}

var array = [{ a: 5, b: { c: 2 } }, { a: 7, b: { c: 1 } }, { a: 1, b: { c: 3 } }];


sortByKey(array, 'a');
console.log(array);
sortByKey(array, 'b.c');
console.log(array);

ES6
一个二个一个一个

相关问题