繁体   English   中英

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

[英]Sorting nested array of objects with dynamic key

我正在尝试创建一种排序功能,该功能对对象的嵌套数组进行排序,同时动态地提供键(具有不同的深度)。

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循环。 目的是使该函数与“名称”,“名称。第一”和“名称。第一。另一个”一起使用(例如)。 有没有办法动态地做到这一点?

换句话说,我想对不同的数组使用相同的函数。 因此,对于一个数组,我想对其进行排序,调用sortByKey(array1,'name'),对另一个sortByKey(array2,'location.address')进行排序,并可能对第三个sortByKey(array3,'location.address.postalcode')进行排序像那样。

提取属性提取功能

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));
    })
  }

我认为您的意思是这样的:

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;

    });

};

您的问题是作业被滥用,应该在此处进行比较。

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

 function sortByKey(array, key) { var getValue = (o, k) => o[k], keys = key.split("."); return array.sort((a, b) => 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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM