嵌套 for..of 迭代第一个数组元素

问题描述 投票:0回答:2

我有这样的数据结构

const array = [
  [["first_name" , "First"], ["image" , "image"]],
  [["email" , "email"]],
  [["last_name","last_name"]],
  [["password" , "password"], ["password", "password"]]
]

我的迭代器实现是

let arr = array.values();
let obj = {
  [Symbol.iterator]: function () {
    return {
      next() {
        for (const iterator of arr) {
          for (let [, value] of iterator) {
            return {
              done: false,
              value,
            };
          }
        }

        return {
          done: true,
        };
      },
    };
  },
}

但是当我迭代它时

[...obj]

我只得到二维数组的第一个元素

我得到的输出是

["First" , "email" , "last_name" , "password"]

预期产出

["First" , "image" , "email" , "last_name" , "password", "password"]

嵌套 for..in 仅迭代嵌套数组的第一个元素

注意:- 上述解决方案与 Symbol.Iterator 生成器函数一起工作正常

javascript iterator for-in-loop
2个回答
0
投票

就像Nenad Vracar的答案一样,由于它是从内部for循环语句返回的,因此它不会循环所有内部数组,只有外部数组循环并结束。

必须能够保存各个状态,以单独使用

Symbol.iterator
实现您想要的功能,而无需使用
Generator

const array = [
  [["first_name" , "First"], ["image" , "image"]],
  [["email" , "email"]],
  [["last_name","last_name"]],
  [["password" , "password"], ["password", "password"]]
];

const obj = {
  [Symbol.iterator]: () => {
    return {
      stack: [...array],
      target: [],
      next() {
        if (!this.target.length && !this.stack.length) return {
          done: true,
          value: undefined,
        }
        if (!this.target.length) this.target = this.stack.shift();

        return {
          done: false,
          value: this.target.shift()[1],
        };
      },
    }
  }
};

console.log([...obj]); // ['First', 'image', 'email', 'last_name', 'password', 'password']

0
投票

前面已经提到过,您从第一次迭代中就退出了内部循环,因此下次执行

return
时,您可以从
next
迭代器获取下一个值,从而跳过内部循环的任何迭代如果你没有摆脱它,一个人仍然会表演。
但从 ECMAScript 2025 开始,有 

arr

 迭代器辅助方法:您可以将其链接到输入迭代器。
它需要一个函数作为参数,返回一个可迭代对象来进行(子)迭代,但在您的情况下,您只想提供子数组本身进行迭代,因此您可以传递一个恒等函数。就像

flatMap

一样(正如你所期望的一个对象)。在该方法调用之后,您可以链接更多辅助方法,例如

Object
:

map

© www.soinside.com 2019 - 2024. All rights reserved.