无法弄清楚如何在JavaScript中使用“ for ... in”

时间:2018-09-27 11:29:47

标签: javascript

以下代码期望this.triggeredTests的所有属性都是数组,并计算其总长度:

    let savedLen = 0;

    const values = Object.values(this.triggeredTests);

    for (let i = 0; i < values.length; i += 1) {
      savedLen += values[i].length;
    }

如果我尝试使用 for ... in 中的代码重写此代码:

    for (const val in values) {
      savedLen += val.length;
    }

我遇到了一些烦人的错误:

  ✘  http://eslint.org/docs/rules/guard-for-in          The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype
  src\components\entity\Test.vue:171:9
          for (const val in values) {
          ^

  ✘  http://eslint.org/docs/rules/no-restricted-syntax  for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array
  src\components\entity\Test.vue:171:9
          for (const val in values) {
          ^


✘ 2 problems (2 errors, 0 warnings)


Errors:
  1  http://eslint.org/docs/rules/no-restricted-syntax
  1  http://eslint.org/docs/rules/guard-for-in

是否可以使此用于...在中工作?

我确定我使用的是什么编译器,但至少我知道我正在NPM的Node.js v8.12.0环境中工作。

EDIT1:

如果我将用于...的

    for (const val of values) {
        savedLen += val.length;
    }

我遇到另一个错误:

    ✘  http://eslint.org/docs/rules/no-restricted-syntax  iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations
    src\components\entity\Test.vue:171:9
            for (const val of values) {
            ^

EDIT2:

这不会产生错误:

    const values = Object.values(this.triggeredTests);
    const sumCalculator = (accumulator, currentValue) => accumulator + currentValue.length;
    const savedLen = values.reduce(sumCalculator, 0);

4 个答案:

答案 0 :(得分:1)

我相信您将python与语法混淆,node正在使用for-of枚举可迭代对象的值

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

答案 1 :(得分:1)

您的错误确实是由于eslint而不是javascript中的for循环造成的。您可以将所拥有的内容粘贴到chrome开发工具中,并且无需编译就可以正常工作。

特别是这些棉绒

这两种方法都可以防止与对象相关的for循环中出现奇数,因为它将遍历所有元素。

在这种情况下,如果这是一个基本数组,我建议使用

values.forEach(iterator)

答案 2 :(得分:1)

在这里,我不会将错误描述为烦人-它试图保护您免受不必要的影响。使用以下示例代码:

Array.prototype.someFunc = function () { }

const someObject = { a: 'A', b: 'B', c: 'C' };
const someObjectValues = Object.values(someObject);

for (const v in someObjectValues) {
    console.log(v);
}

这里至少有两个问题:

  1. v将是元素的 index :您将获得{{1},而不是ABC }},01
  2. 您还将获得2,这显然不是故意的。

这里最简单的解决方案是记下掉毛错误,并保持原样。

答案 3 :(得分:1)

您正在遍历数组。您正在寻找SELECT TO_TIMESTAMP_TZ( updateDate 'DY MON DD HH24:MI:SS TZHTZM YYYY', 'NLS_DATE_LANGUAGE=ENGLISH' ) AT TIME ZONE '-05:00' as fechaCol from irregularities 循环。 如果您想使用for...of,请尝试

for...in

也可以在这里查看有关两个循环https://bitsofco.de/for-in-vs-for-of/

的一些好信息