在 Object.entries 上运行 forEach 不会返回与 for 循环相同的内容

Posted

技术标签:

【中文标题】在 Object.entries 上运行 forEach 不会返回与 for 循环相同的内容【英文标题】:Running forEach on Object.entries does not return the same thing as a for loop 【发布时间】:2021-05-20 12:24:50 【问题描述】:

我正在使用常规 for 循环遍历一个对象,这对我来说很好。但是,我试图删除代码的所有 for 循环,转而支持数组迭代,并且由于某种原因,我不明白为什么在使用 forEach 时会得到不同的结果。

注意:这里的 forEach 来自一个名为 p-iteration 的模块

https://www.npmjs.com/package/p-iteration

这工作正常,它返回正确的值。

  for await (const [key, value] of Object.entries(tatGroupedByRegion)) 
    onTarget = 0;
    notOnTarget = 0;
    const cases = [];
    await forEach(value, async email => 
      if (!cases.includes(email.new_name)) 
        cases.push(email.new_name);
        isOnTarget(email);
      
    );

    backlogData[key].tatd1 = percentage(onTarget, notOnTarget);
    tatd1Total.value += parseInt(percentage(onTarget, notOnTarget), 10);
    if ((parseInt(percentage(onTarget, notOnTarget) !== 0), 10)) 
      tatd1Total.count += 1;
    
  

这不行,这部分在这里backlogData[key].tatd1 = percentage(onTarget, notOnTarget),一遍又一遍地返回相同的值。

 await forEach(Object.entries(tatGroupedByRegion), async ([key, value]) => 
    onTarget = 0;
    notOnTarget = 0;
    const cases = [];
    await forEach(value, async email => 
      if (!cases.includes(email.new_name)) 
        cases.push(email.new_name);
        isOnTarget(email);
      
    );

    backlogData[key].tatd1 = percentage(onTarget, notOnTarget);
    tatd1Total.value += parseInt(percentage(onTarget, notOnTarget), 10);
    if ((parseInt(percentage(onTarget, notOnTarget) !== 0), 10)) 
      tatd1Total.count += 1;
    
  );

【问题讨论】:

查看此链接:***.com/questions/50844095/… k.meinkopf's answer 显示源代码。 The documentation 提到了同样的事情 - forEacharrays 一起使用。 Object.entries 返回一个 iterable,因此它不适用于仅传入数组(-likes)的假设。您需要先将条目转换为数组,或者您需要直接使用可迭代本身而不实现它。我不太确定怎么做,因为我不确定你为什么有 async/await - 看起来你没有异步操作。 【参考方案1】:
exports.forEach = async (array, callback, thisArg) => 
  const promiseArray = [];
  for (let i = 0; i < array.length; i++) 
    if (i in array) 
      const p = Promise.resolve(array[i]).then((currentValue) => 
        return callback.call(thisArg || this, currentValue, i, array);
      );
      promiseArray.push(p);
    
  
  await Promise.all(promiseArray);
;

这是您正在使用的forEach 的实现。回调接收this 作为第一个参数,这可能是个问题。

【讨论】:

"它使用for .. in 而不是for .. of" 它使用普通的for 循环,它使用in 运算符。这与for...in 不同。但是,for 循环确实意味着它仅适用于 Object.entries 不适用的数组。 @VLAZ 感谢您的澄清,我不明白我为什么想到for .. in

以上是关于在 Object.entries 上运行 forEach 不会返回与 for 循环相同的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Typescript 中输入 Object.entries() 和 Object.fromEntries?

Object.entries() 和 Object.values() 在 WebStorm/PhpStorm 中没有被键入为数组

Object.entries()但是对象而不是数组

Object构造函数的方法 之Object.entries()

如何使 Object.entries 在 TypeScript 中可用? [复制]

TypeScript 中的 ES7 Object.entries() 不起作用