var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
如果我做了
for(key in obj) {
console.log( key + ' has a value ' + obj[key] );
}
它会查看obj
中的所有值。如果我有一个更大的对象,我怎么知道我是否在for
循环的最后一次迭代?
我意识到键值对并不是按顺序组织的,但是我需要在这个循环的最后一次迭代中完成一些事情并且不知道如何。
答案 0 :(得分:31)
不要使用for (key in obj)
,它将迭代所有可枚举的属性,包括原型属性,并可能导致令人惊讶的可怕事情。 Modern JS有一个特殊的功能,只使用Object.keys(...)
从对象中获取相关的键,所以如果使用var keys = Object.keys(obj)
将键列表作为数组获取,则可以迭代:
// blind iteration
Object.keys(obj).forEach(function(key, i) {
var value = obj[key];
// do what you need to here, with index i as position information.
// Note that you cannot break out of this iteration, although you
// can of course use ".some()" rather than ".forEach()" for that.
});
// indexed iteration
for(var keys = Object.keys(obj), i = 0, end = keys.length; i < end; i++) {
var key = keys[i], value = obj[key];
// do what you need to here, with index i as position information,
// using "break" if you need to cut the iteration short.
});
或立即选择其最后一个元素
var keys = Object.keys(obj);
var last = keys[keys.length-1];
或使用切片:
var keys = Object.keys(obj);
var last = keys.slice(-1)[0];
答案 1 :(得分:3)
您可以遍历所有这些并将最后一个保存在变量中。
var lastItem = null;
for(key in obj) {
console.log( key + ' has a value ' + obj[key] );
lastItem = key;
}
// now the last iteration's key is in lastItem
console.log('the last key ' + lastItem + ' has a value ' + obj[lastItem]);
另外,由于JavaScript的工作原理,键也在你的循环键变量中,因此甚至不需要额外的变量。
for(key in obj) {
console.log( key + ' has a value ' + obj[key] );
}
// now the last iteration's key is in key
console.log('the last key ' + key + ' has a value ' + obj[key]);
答案 2 :(得分:3)
更短
var last = (last=Object.keys(json))[last.length-1];
答案 3 :(得分:0)
您可以将最后一项的逻辑放在循环之外:
var last_item = null;
for(key in obj) {
last_item = key;
}
console.log(last_item);
答案 4 :(得分:0)
您可以将所有键/值推送到您创建的空数组变量中。然后,使用array.length-1访问数组中的最后一个元素。
答案 5 :(得分:-2)
for(var x=0 ; x<Object.keys(obj).length ; x++)
{
if(x==Object.keys(obj).length-1) // code for the last iteration
}
或者可以使用Object.size(obj)