Javascript 检查是否在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/in循环,我想知道我是否在循环的末尾。我不完全确定这将如何工作

我的代码是:

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
循环外部进行检查
似乎效率不高。