获取"下一个“;对象中的数值
Get "next" numeric value in 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循环,但我不知道如何确保它的顺序正确。
因为不能保证对象的密钥顺序,所以必须对所有密钥进行迭代,并计算出最接近的高低值:
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
,在这种情况下,当用作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对象并不是本机排序的。你可能想看看这个问题,了解它是如何工作的,以及你能做些什么
相关文章:
- "“;变量未引用正确的对象
- 如何创建js常量对象与"依赖/相对;价值观
- "属性描述必须是对象“”;错误
- 获取"下一个“;对象中的数值
- 得到"TypeError:对象不是函数“”;在forEach循环中使用超级测试/超级代理时
- "键“;jQuery中的对象无法正常工作
- 为什么下面抛出一个“;对象没有't支持属性或方法'importNode'"在IE11中
- "未捕获[对象对象]”;投掷和接球时
- "对象不是函数“;当将Node.js HTTP服务器对象传递给Socket.IO时
- 将对象设置为Backbone.js模型,而不必调用“;set()"在每一处房产上
- 得到"未捕获的类型错误:未定义的不是函数“;当试图从对象调用get()或set()时
- 获得错误“;对象没有方法'jScrollPane'"与AngularJS一起使用时
- "类型错误:'null'不是对象(正在评估“a.nodeType')”;在phanto
- "这个“;对象函数内部的引用
- "对象没有't支持这种性质或方法“;在IE 8中.在调试中执行精细
- "Function.createDelegate"原因;错误:对象没有't支持属性或方法
- 在javascript中,使用requireJS,我如何"要求“;typescript对象
- a href="上的javascript对象对象;javascript:"呼叫
- TypeError:undefined不是一个对象(正在评估'msg.innerHTML="Uploa
- 获取对象"值“;在数组中