Javascript 检查是否在for/in循环的末尾
我有一个for/in循环,我想知道我是否在循环的末尾。我不完全确定这将如何工作 我的代码是:Javascript 检查是否在for/in循环的末尾,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个for/in循环,我想知道我是否在循环的末尾。我不完全确定这将如何工作 我的代码是: for (const key in posts.val()) { if(posts.val()[key][postId] != undefined) { found = true; //do something } else { // if at end && found !== true } } 你知道我
for (const key in posts.val()) {
if(posts.val()[key][postId] != undefined) {
found = true;
//do something
} else {
// if at end && found !== true
}
}
你知道我怎么知道自己是否在for/in循环的末尾吗
谢谢大家! 除非您指的是迭代的最后一个键,否则没有对象结束的真正概念。您可以获取对象的键、迭代并根据键检查索引。长度-1:
let obj = posts.val();
Object.keys(obj).forEach((k, i, keys) => {
if(obj[k][postId] !== undefined) {
let found = true;
//do something
} else {
let atEnd = (i === keys.length-1);
// if at end && found !== true
}
});
通常,查找内容如下所示:
function isFound(obj, cmpFn) {
let found = false;
for (let k in obj) {
if (cmpFn(obj[k]) === true) {
found = true;
break;
}
}
return found;
}
或:
您应该在某个地方有两个键,这样您就可以完全避免迭代:
let isFound = (id_b in obj[id_a]);
如果不在表中存储空条目(这通常是可取的),则上述方法可以起作用
我还建议使用
==代码>超过=编码>以避免强制和歧义。除非您指的是要迭代的最后一个键,否则没有对象结束的真正概念。您可以获取对象的键、迭代并根据键检查索引。长度-1:
let obj = posts.val();
Object.keys(obj).forEach((k, i, keys) => {
if(obj[k][postId] !== undefined) {
let found = true;
//do something
} else {
let atEnd = (i === keys.length-1);
// if at end && found !== true
}
});
通常,查找内容如下所示:
function isFound(obj, cmpFn) {
let found = false;
for (let k in obj) {
if (cmpFn(obj[k]) === true) {
found = true;
break;
}
}
return found;
}
或:
您应该在某个地方有两个键,这样您就可以完全避免迭代:
let isFound = (id_b in obj[id_a]);
如果不在表中存储空条目(这通常是可取的),则上述方法可以起作用
我还建议使用==代码>超过=代码>以避免强制和歧义。类似的东西没有内置功能。假设在调用.val()
时属性没有发生变化,您可以首先调用.val()
来获取对象,使用for..in
统计键数(包括继承键),然后再次使用for..in
进行迭代,并能够测试您离循环结束有多近:
const val = posts.val();
let totalKeyCount = 0;
for (const _ in posts.val()) {
totalKeyCount++;
}
let keyIndex = 0;
for (const key in posts.val()) {
keyIndex++;
if(val[key][postId] != undefined) {
found = true;
//do something
} else {
if (keyIndex === totalKeyCount) {
console.log('last iteration');
}
}
}
但是,如果您不依赖继承的键,那么最好使用Object.keys
,它返回一个数组,并且可以使用哪些数组方法
假设您试图在对象(以及对象本身)中查找特定值,则可以在对象上使用.find
.values
:
const foundPost = Object.values(posts.val()).find(item => item[postId] !== undefined);
// if an item[postId], if it exists, will be truthy, simplify to `item => item[postId]`
if (foundPost) {
// do something with the found post
} else {
// all iterations have been completed, and nothing was found
}
还要注意,在for..in
循环中迭代的属性顺序并不完全可靠。正如上面所说:
for…in循环以任意顺序对对象的属性进行迭代(有关为什么不能依赖于迭代的表面顺序的更多信息,请参阅delete操作符,至少在跨浏览器设置中是如此)
类似的东西没有内置的功能。假设在调用.val()
时属性没有发生变化,您可以首先调用.val()
来获取对象,使用for..in
统计键数(包括继承键),然后再次使用for..in
进行迭代,并能够测试您离循环结束有多近:
const val = posts.val();
let totalKeyCount = 0;
for (const _ in posts.val()) {
totalKeyCount++;
}
let keyIndex = 0;
for (const key in posts.val()) {
keyIndex++;
if(val[key][postId] != undefined) {
found = true;
//do something
} else {
if (keyIndex === totalKeyCount) {
console.log('last iteration');
}
}
}
但是,如果您不依赖继承的键,那么最好使用Object.keys
,它返回一个数组,并且可以使用哪些数组方法
假设您试图在对象(以及对象本身)中查找特定值,则可以在对象上使用.find
.values
:
const foundPost = Object.values(posts.val()).find(item => item[postId] !== undefined);
// if an item[postId], if it exists, will be truthy, simplify to `item => item[postId]`
if (foundPost) {
// do something with the found post
} else {
// all iterations have been completed, and nothing was found
}
还要注意,在for..in
循环中迭代的属性顺序并不完全可靠。正如上面所说:
for…in循环以任意顺序对对象的属性进行迭代(有关为什么不能依赖于迭代的表面顺序的更多信息,请参阅delete操作符,至少在跨浏览器设置中是如此)
Last与对象键的枚举顺序相同,或者是否存在特定的Last
键?不,没有Last
键,只要我们点击for循环的底部,并且found
仍然为false,为什么不使用posts.val()在for
循环外部进行检查
似乎效率不高。Last as在对象键的枚举顺序中,或者是否有特定的Last
键?不,没有Last
键,只要我们点击for循环的底部,并且found
仍然是错误的,为什么不使用posts.val()在for
循环外部进行检查
似乎效率不高。