下划线多维sortBy

时间:2015-08-01 13:50:10

标签: javascript sorting underscore.js

我有一个对象。

[
    { "home1": { "mesafe":11 } },
    { "home2": { "mesafe": 6 } },
    { "home3": { "mesafe":42 } },
    { "home4": { "mesafe":23 } },
    { "home5": { "mesafe": 5 } }
]

如何使用下划线以ASC数字mesafe字段顺序对此对象进行排序?

2 个答案:

答案 0 :(得分:0)

您可以使用JavaScript Array sort() Method根据mesafe字段中的值对数组进行排序。

var data = [
    { "home1": { "mesafe":11 } },
    { "home2": { "mesafe": 6 } },
    { "home3": { "mesafe":42 } },
    { "home4": { "mesafe":23 } },
    { "home5": { "mesafe": 5 } }
];

// get the value from mesafe field
function getMesafeValue(a) {
  for (var key in a) {
    if (a.hasOwnProperty(key)) {
      return a[key].mesafe;
    }
  }
}

// sort the array
data.sort(function(a, b) {

  var v1 = getMesafeValue(a);
  var v2 = getMesafeValue(b);

  return v1 < v2 ? -1 : (v1 > v2 ? 1 : 0);
});

// print the array after sorting
for (var i = 0; i < data.length; i++) {
  for (var key in data[i]) {
    if (data[i].hasOwnProperty(key)) {
      document.write(key + " -> " + data[i][key].mesafe + '<br/>');
    }
  }
}

答案 1 :(得分:0)

你可以考虑

throwOutConfidence

as

{
  "home1": {
    "mesafe":11 
  }
} 

现在要排序的值可以描述为:

从subObject获取所有{ "home1": { "mesafe":11 }, // fakes "home2": {}, "home3": {}... } 属性的值并将它们相加(如果属性存在)。

因此,您可以使用mesafe来实现它。

_.reduce
var list = [
    { "home1": { "mesafe":11 } },
    { "home2": { "mesafe": 6 } },
    { "home3": { "mesafe":42 } },
    { "home4": { "mesafe":23 } },
    { "home5": { "mesafe": 5 } }
];

var sortedList = _.sortBy(list, function(item) {
  
  // For each item, we acts as  there not only have one attribute "homex", but there's many other like "homey : {}".
  var res =  _.reduce(item, function(res, sub) {
    // So we can the again use reduce to iterate through them, and add the value if mesafe exist.
    return (sub.mesafe == null) ? res : res + sub.mesafe;
  }, 0);
  
  return res;
});

console.log(sortedList);

相关问题