Javascript 对象中的排名值

Ranking Values in Javascript object

我想做的是查看 "water" 的所有值,并通过在 key:value 中添加新的 key:value 将它们从低到高排列。

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

到目前为止我有这个,它的工作原理是先排序然后分配等级,但我不确定如何检查其他值以查看它是否相同。如果相同,我想我会分配 '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

存储以前的值和以前的索引,检查值是否重复然后分配索引。像这样

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>

这是我的方法:

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() 将项目映射到排名以获得实际排名值。