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

未捕获的类型错误:项不可重复

  •  2
  • London804  · 技术社区  · 6 年前

    我的理解是 for...in 循环被设计为在JavaScript中迭代对象。 See this post this post.

    以下面的例子为例。这将在我的控制台中返回“uncaught typeerror:items is not iterable”。

    var text = {
      name: "Coptic",
      ranges: [[994, 1008], [11392, 11508], [11513, 11520]],
      direction: "ltr",
      year: -200,
      living: false,
      link: "https://en.wikipedia.org/wiki/Coptic_alphabet"
    };
    
    function dominantDirection(items) {
      for (let item of items) {
        if (item.direction === 'ltr') {
          return 'ltr';
        } else {
          return 'rtl';
        }
      }
    }
    
    console.log(dominantDirection(text));

    如果我将对象包装在数组[]中,它会正常工作。 不过,我的第二个示例如预期的那样工作。

    var object1 = {a: 1, b: 2, c: 3};
    var string1 = "";
    
    function loopObj() {
      for (var property1 in object1) {
        console.log(string1 = string1 + object1[property1]);
      }
    }
    
    console.log(loopObj());

    为什么第一个示例需要数组,而第二个示例不需要数组?

    1 回复  |  直到 5 年前
        1
  •  3
  •   codejockie    5 年前

    在第一个示例中,您使用 for..of 不能用于对象,只能用于字符串和数组。要迭代对象,请使用 for..in 构造或通过使用 Object.keys() .

    示例使用 对象.keys()) :

    const text = {
      name: "Coptic",
      ranges: [[994, 1008], [11392, 11508], [11513, 11520]],
      direction: "ltr",
      year: -200,
      living: false,
      link: "https://en.wikipedia.org/wiki/Coptic_alphabet"
    };
    
    for (let key of Object.keys(text)) {
      
      console.log(`${key}: ${text[key]}`);
    }

    或者你也可以用新的 Object.entries() 要获得以下键和值:

    const text = {
      name: "Coptic",
      ranges: [[994, 1008], [11392, 11508], [11513, 11520]],
      direction: "ltr",
      year: -200,
      living: false,
      link: "https://en.wikipedia.org/wiki/Coptic_alphabet"
    };
    
    for (let [key, value] of Object.entries(text)) {
      
      console.log(`${key}: ${value}`);
    }