使用动态键

时间:2016-08-18 12:24:46

标签: javascript arrays sorting

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

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循环。目标是该功能适用​​于&#39; name&#39;,#name; name.first&#39;并且&#39; name.first.another&#39; (举个例子)。有没有办法动态地做到这一点?

换句话说,我想对不同的数组使用相同的函数。因此,对于一个数组,我想对它进行排序,调用sortByKey(array1,&#39; name&#39;)和另一个sortByKey(array2,&#39; location.address&#39;)并且可能使用第三个sortByKey(array3, &#39; location.address.postalcode&#39;)或类似的东西。

3 个答案:

答案 0 :(得分:2)

提取属性提取功能

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

答案 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;

    });

};

答案 2 :(得分:0)

你的问题是一个误用的作业,它应该是一个比较。

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

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

&#13;
&#13;
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);
&#13;
&#13;
&#13;

ES6

&#13;
&#13;
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);
&#13;
&#13;
&#13;