得到" next"对象中的数值

时间:2015-03-05 08:55:51

标签: javascript sorting object

我有一个这样的对象:

var rock = {
 5: 0.5,
 0: 0.8,
 10: 0.3,
 2: 1.0,
}

我有一个像4.3的数字,我需要先前和后续数字的索引和值。在这个例子中我会得到

var timeA = 2;
var valueA = 1.0
var timeB = 5;
var valueB = 0.5;

我的第一个想法是类似for循环,但我不知道如何确保它的顺序正确。

3 个答案:

答案 0 :(得分:2)

由于无法保证对象的键排序,因此您必须迭代所有键并计算出最接近的较低和较高值:

var rock = {
 0: 0.8,
 2: 1.0,
 5: 0.5,
 10: 0.3
};

var max = Infinity, min = -Infinity;
var to_find = 4.3;

Object.keys(rock).forEach(function(k) {
  var value = +k;

  if (value <= to_find && value > min) {
      min = value;
  } else if (value >= to_find && value < max) {
      max = value;
  }
});

console.log(min, rock[min], max, rock[max]); // 2, 1, 5, 0.5

请注意,之后minmax可能仍有其原始值,即-InfinityInfinity,在这种情况下,undefined会在使用时产生作为rock的关键。

答案 1 :(得分:1)

您可以使用javascript中的for..inhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in)循环来遍历对象的属性。使用它,您可以针对给定值测试属性name。获得这两个属性后,您可以使用它们作为索引来访问属性值。

var given = 4.3;
var timeA = null;
var timeB = null;
for(var e in rock){
    if(e > given){
        timeB = e;
        break;
    }
    timeA = e;    
}
var valueA = rock[timeA];
var valueB = rock[timeB];

JSFiddle:http://jsfiddle.net/x4hzetw7/

如果您希望按预期工作,则必须找到对属性进行排序的方法。为此,您可以按照之前答案之一的链接(使用Object.keys(obj))。

var given = 4.3;
var timeA = null;
var timeB = null;
var keys = Object.keys(rock);
var sorted = keys.map(Number).sort(function(a,b) {return a[0]-b[0];});
for(var i = 0; i < sorted.length; i++){
    var e = keys[i];
    if(e > given){
        timeB = e;
        break;
    }
    timeA = e;    
}
var valueA = rock[timeA];
var valueB = rock[timeB];

更新了JSFiddle:http://jsfiddle.net/x4hzetw7/5/

答案 2 :(得分:-2)

您可以这样做:

for (var i in rock) {
    if (rock.hasOwnProperty(i) && rock[i] !== null) {
        var val = rock[i];
        console.log("rock["+i+"] = ", val);
    }
};

但JS对象本身没有排序。您可能希望查看this question以了解它的工作原理以及您可以采取的措施。