为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 处理长度可能为一个元素的数组的最佳方法

Javascript 处理长度可能为一个元素的数组的最佳方法

qq_花开花谢_0 2022-01-07 20:52:05
我意识到可能是主观的......但我在循环“数组”时遇到了问题。当“阵列”是多个元素......它实际上是一个数组,所以我for...of和array.forEach做工精细。但是如果函数只接收一个项目,那么它就不是一个数组,它只是一个对象,我遇到了问题。我通过将它包装在 if 语句中解决了这个问题,但是每次我循环遍历实际上可能是单个对象而不是对象数组的东西时,这似乎有点疯狂。async function writeToDB(myArray: []) {  const db = await openDB("DomainsDB", 1);  const tx = db.transaction("Domains", "readwrite");  if (myArray.length > 1) {    myArray.forEach(async(r: any) => {      await tx.store.add(r["SearchHeader"]);    });  } else {    await tx.store.add(myArray["SearchHeader"]);  }  await tx.done;}
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

由于myArraytype 是一个数组,TypeScript 应该阻止您分配单个项目。如果您使用不支持类型的 Javascript,或者使用删除构建时键入的 babble 插件(在这种情况下,IDE 应该警告您),就会发生这种情况。


JS中这个问题的可能解决方案:


您可以连接myArray到一个空数组。如果myArray是数组或单个项目,则结果将始终是数组:


async function writeToDB(myArray: []) {

  const db = await openDB("DomainsDB", 1);

  const tx = db.transaction("Domains", "readwrite");


  const arr = [].concat(myArray); // the result is always an array

  arr.forEach(async(r: any) => {

    await tx.store.add(r["SearchHeader"]);

  });


  await tx.done;

}

另一种选择是分配myArray给另一个数组,并使用Array.flat():


async function writeToDB(myArray: []) {

  const db = await openDB("DomainsDB", 1);

  const tx = db.transaction("Domains", "readwrite");


  const arr = [myArray].flat(); // the result is always an array

  arr.forEach(async(r: any) => {

    await tx.store.add(r["SearchHeader"]);

  });


  await tx.done;

}


查看完整回答
反对 回复 2022-01-07
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信