代码之家  ›  专栏  ›  技术社区  ›  Simon

检查是否在for/in循环的末尾

  •  0
  • Simon  · 技术社区  · 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循环的末尾吗?

    谢谢您!

    2 回复  |  直到 6 年前
        1
  •  4
  •   CertainPerformance    6 年前

    类似的东西没有内置的功能。假设属性在 .val() 是的,你 呼叫 .val() 最初要获取对象,请使用 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 Object.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
    }
    

    还要注意在 为了..在 完全可靠。作为 MDN

    for…in循环以任意顺序对对象的属性进行迭代(请参阅delete操作符以了解为什么不能依赖于迭代的表面顺序,至少在跨浏览器设置中是这样)。

        2
  •  1
  •   Rafael    6 年前

    没有对象结束的真正概念,除非你指的是迭代的最后一个键。您可以获取对象的键、迭代并检查索引键.长度-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;
    }
    

    或:

    function isFound(obj, cmpFn) {
        return Object.keys(obj)
                     .some(k => cmpFn(obj[k]));
    }
    

    您应该在某个地方同时拥有这两个键,这样就可以完全避免迭代:

    let isFound = (id_b in obj[id_a]);
    

    我也建议使用 !== 结束 != 避免强迫和模棱两可。