在Javascript对象中排名值

时间:2015-07-08 11:22:44

标签: javascript arrays lodash

我想要做的是查看“water”的所有值,并通过添加新密钥将值从最低到最高排列:值。

然而,如果水的价值与另一个相同,我想给它分配相同的等级。

到目前为止,我有这个,这是因为它命令然后指定等级,但我不确定如何检查其他值以查看它是否相同。如果它是相同的,我想我只会指定'index'而不是'index + 1'

var results = {
    schedules: [
        { water: 10326.11, milk: 231.27, cola: 171.85 },
        { water: 10326.11, milk: 231.27, cola: 171.85 },
        { water: 1500, milk: 231.27, cola: 171.85 }
    ]
};

results = _(_.sortBy(results.schedules, "water")).forEach(function (water,    index) {
water.waterRank = index + 1;
});

console.log(results);

Js Fiddle Here

2 个答案:

答案 0 :(得分:1)

存储先前的值和上一个索引,检查值是否重复,然后分配索引。像这样的东西

var index = 0, prevValue = 0;
_(_.sortBy(results.schedules, "water")).forEach(function (water, i) {
    if(prevValue != water.water) index++;
    prevValue = water.water;
    results.schedules[i].waterRank = index;
});
console.log(results.schedules);



var results = {
  "schedules": [{
    "water": 10326.11,
    "milk": 231.27,
    "cola": 171.85
  }, {
    "water": 10326.11,
    "milk": 231.27,
    "cola": 171.85
  }, {
    "water": 1500,
    "milk": 231.27,
    "cola": 171.85
  }, {
    "water": 1500,
    "milk": 231.27,
    "cola": 171.85
  }, {
    "water": 10500,
    "milk": 231.27,
    "cola": 171.85
  }, {
    "water": 10500,
    "milk": 231.27,
    "cola": 171.85
  }]
};

var index = 0,
  prevValue = 0;
_(_.sortBy(results.schedules, "water")).forEach(function(water, i) {
  if (prevValue != water.water) index++;
  prevValue = water.water;
  results.schedules[i].waterRank = index;
});
console.log(results.schedules);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.2.1/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这是我的方法:

var rankings = _(results.schedules)
    .pluck('water')
    .uniq()
    .sortBy()
    .value();

_.map(results.schedules, function(item) {
    return _.defaults({
        waterRank: _.indexOf(rankings, item.water) + 1
    }, item);
});

第一步是构建rankings数组。这里的诀窍是uniq()删除了重复的值,因此与其他项目绑定的任何项目都将共享相同的排名。

然后,您只需使用indexOf()将项目映射到排名,即可获得实际排名值。