【发布时间】:2016-01-12 13:36:54
【问题描述】:
我有一个这样的对象数组:
var data = {
a: [
{ keyone:'c', keytwo: 'anna', keythree: 21, keyfour: 15 },
{ keyone:'a', keytwo: 'anna', keythree: 22, keyfour: 15 },
{ keyone:'s', keytwo: 'anna', keythree: 10, keyfour: 15 },
{ keyone:'v', keytwo: 'anna', keythree: 7, keyfour: 15 }
],
b: [
{ keyone:'f', keytwo: 'any', keythree: 45, keyfour: 100 },
{ keyone:'b', keytwo: 'any', keythree: 146, keyfour: 100 },
{ keyone:'t', keytwo: 'any', keythree: 23, keyfour: 100 },
{ keyone:'h', keytwo: 'any', keythree: 11, keyfour: 100 }
]
};
我想根据keythree 和keyfour 的值在组内以及整个数据集中为每个对象分配等级。我该怎么做?
更新:我在上面的代码中描述了等级。
结果对象:
var data = {
a: [
{ keyone:'c', keytwo: 'anna', keythree: 21, keyfour: 15, rankgroup: 3, rankall: 4 },
{ keyone:'a', keytwo: 'anna', keythree: 22, keyfour: 15, rankgroup: 4, rankall: 5 },
{ keyone:'s', keytwo: 'anna', keythree: 22, keyfour: 15, rankgroup: 2, rankall: 2 },
{ keyone:'v', keytwo: 'anna', keythree: 7, keyfour: 15, rankgroup: 1, rankall: 1 }
],
b: [
{ keyone:'f', keytwo: 'any', keythree: 45, keyfour: 100 },
{ keyone:'b', keytwo: 'any', keythree: 146, keyfour: 100 },
{ keyone:'t', keytwo: 'any', keythree: 23, keyfour: 100 },
{ keyone:'h', keytwo: 'any', keythree: 11, keyfour: 100 }
]
};
我正在使用lodash。我的想法是首先根据这些键对数组进行排序,然后遍历原始对象,通过比较另一个键来插入排序索引。这是我尝试过的:
var keys = Object.keys(data);
var result = {};
var numkeys;
for(var i=0; i < keys.length; i++) {
if(!numkeys) {
var numkeys = _.keys(_.pick(data[keys[i]][0], _.isNumber));
}
for(var j=0;j<numkeys.length;j++) {
var sorted = _.sortBy(data['a'], numkeys[j]);
_.forEach(sorted, function(n, k) {
//THIS FAILS
var t = _.set(_.where(data[keys[i]], {keyone: n.keyone}), keys[i]+'rank', k);
console.log(t);
});
}
}
我该怎么做?我的逻辑似乎太复杂了,set 方法并没有按键更新原始对象,而是在主对象之后添加了一个新条目。
更新:注意22 与对象a 重复出现。这会导致在分配排名时出现问题,因为indexOf 将始终返回第一次出现的索引,因此第二次出现的索引永远不会分配给它,因此该值将是未定义的。
【问题讨论】:
-
在整个数据集中是什么意思?你是指
a和b还是在a和b内? -
应该对每个子数组进行排序,意思是a和be,并且应该w.r.t.到对象数组的整个列表。我将更新我的描述以添加这一事实。
-
请添加排序数组的示例。
-
我不想排序,排序会让我失去原来的索引。我想计算排名。我将发布一个带有排名的结果数组。
标签: javascript arrays sorting lodash ranking