我有一个这样的对象:
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循环,但我不知道如何确保它的顺序正确。
答案 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
请注意,之后min
或max
可能仍有其原始值,即-Infinity
和Infinity
,在这种情况下,undefined
会在使用时产生作为rock
的关键。
答案 1 :(得分:1)
您可以使用javascript中的for..in
(https://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以了解它的工作原理以及您可以采取的措施。