因此,我最近遇到了一个似乎无法解决的问题。

假设我已经在javascript中定义了一个对象数组,并希望用户能够选择对该数组进行排序的值。
当我知道深度时,我对数组进行排序就没有问题了,因为这可能与

array = array.sort(function (a, b) {
    return b["foo"]["bar"] - a["foo"]["bar"];
});


但是我不知道在深度未知的情况下该如何做。我尝试将键放入字符串中并使用eval(),但这似乎不起作用。

我在JSFiddle上建立了一个快速示例,以更好地证明我的意思
http://jsfiddle.net/DakotaSv/c35bj02w/2/

如果有人能想到解决方案,我将不胜感激!

(感谢PatrickD,here is the working JSFiddle对于任何可能有用的人!)

最佳答案

这是一个可行的解决方案。它使用ES6-Syntax,但这应该不是问题:

'use strict'

var users = [
  {'Name' : 'John', 'Attributes' : {'Age' : 5, 'Height' : 1.5, 'Clothes' : {'Shirts' : 5, 'Pants' : 8}}},
  {'Name' : 'Andrew', 'Attributes' : {'Age' : 9, 'Height' : 1.8, 'Clothes' : {'Shirts' : 2, 'Pants' : 5}}},
  {'Name' : 'Lucifer', 'Attributes' : {'Age' : 11, 'Height' : 1.3, 'Clothes' : {'Shirts' : 9, 'Pants' : 4}}}
];

function sort(valuePath, array){
  let path = valuePath.split('.')

  return array.sort((a, b) => {
     return getValue(b,path) -  getValue(a,path)
  });

  function getValue(obj, path){
    path.forEach(path => obj = obj[path])
    return obj;
  }
}


console.log(sort('Attributes.Height', users))
console.log(sort('Attributes.Clothes.Shirts', users))


输出正确。

10-05 20:51
查看更多