繁体   English   中英

嵌套的 Object.keys() 打印属性多次而不是一次

[英]Nested Object.keys() are printing properties multiple times instead of only once

我有两个需要循环的对象,以便以后可以使用它们的属性。 但是,如果我打印变量,每个变量都会打印两次。 我明白,因为我在其他 Object.keys( Object.keys()中有Object.keys() 有没有办法循环遍历这两个对象并且只获取每个变量一次?

我的代码:

Object.keys(newData.name).map(async key => {
    Object.keys(newData._temp.images).map(async keyImage => {
        console.log(newData.name[key].name,'printed 2x instead of once');
        console.log(newData._temp.images[keyImage].rawFile.preview, 'printed 2x instead of once');
    });
});

先感谢您。

您在这里嵌套循环的逻辑是错误的。

这 2 个 object 似乎没有相互连接,这意味着您不需要第一个循环中的数据来执行其他循环。 只需将其拆分为 2 个单独的循环,即可节省时间和重复次数:

let nameKeys = Object.keys(newData.name).map(key => newData.name[key].name);
let imagesKeys = Object.keys(newData._temp.images).map(keyImage => 
                 newData._temp.images[keyImage].rawFile.preview);

现在您可以随时访问nameKeysimageKeys ,它们将包含您之前记录的值。 我的命名可能有点偏离,请随意更改:D

此外,正如其他人提到的那样 - 不需要async关键字......您不会在内部执行任何异步操作(但是,至少。如果这就是您的计划,那么 go 领先并保持它)。

这些迭代器不需要嵌套。 第二个迭代器没有循环通过第一个迭代器的项目。

Object.keys(newData.name).forEach(key => {
    console.log(newData.name[key].name);
});
Object.keys(newData._temp.images).forEach(keyImage => {
    console.log(keyImage[keyImage].rawFile.preview);
});

如果您只对输出数据感兴趣,那么.map()不是正确的 function 使用,因为当您关心返回值时使用它。 如果您只想循环遍历事物,请使用.forEach()

此外,这里不需要async关键字.. 除非您打算稍后在循环中执行一些 async/await 的东西!

您可以遍历索引一次,然后访问 arrays 中的值:

 const names = Object.keys(newData.name);
 const images = Object.keys(newData._temp.images);

for(let i = 0; i < Math.min(names.length, images.length); i++) {
  const name = names[i];
  const image = images[i];
  //...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM