获取"下一个“;对象中的数值

Get "next" numeric value in object

本文关键字:对象 quot 下一个 获取      更新时间:2023-09-26

我有一个这样的对象:

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循环,但我不知道如何确保它的顺序正确。

因为不能保证对象的密钥顺序,所以必须对所有密钥进行迭代,并计算出最接近的高低值:

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,在这种情况下,当用作rock的密钥时将产生undefined

您可以使用for..in(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in)在javascript中循环以循环对象的属性。使用它,您可以根据给定的值测试属性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/

您可以这样做:

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

但是JS对象并不是本机排序的。你可能想看看这个问题,了解它是如何工作的,以及你能做些什么