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

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

我意识到这可能是主观的,但是在遍历“数组”时遇到了问题。

[当“数组”是一个以上的元素时...实际上是一个数组,因此我的for...ofarray.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;
}
javascript arrays typescript
1个回答
1
投票

由于myArray类型是一个数组,所以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;
}
© www.soinside.com 2019 - 2024. All rights reserved.