首页 > 解决方案 > 在不同文件的数组中查找重复名称

问题描述

与我上面建议的用例有点不同。我需要遍历并检查文件数组中的每个文件名,并将具有相同名称的文件推送到新数组中,以便稍后单独上传它们。

到目前为止,这是我的代码,当然我的条件检查有问题,有人能看到我做错了什么吗?

filesForStorage = [
{id: 12323, name: 'name', ...},
{id: 3123, name: 'abc', ...},
{id: 3213, name: 'name', ...},
...
]

    filesForStorage.map((image, index) => {
          for (let i = 0; i < filesForStorage.length; i++) {
            for (let j = 0; j < filesForStorage.length; j++) {
              if (
                filesForStorage[i].name.split(".", 1) ===.   //.split('.', 1) is to not keep in consideration the file extension
                filesForStorage[j].name.split(".", 1)
              ) {
                console.log(
                  "----FILES HAVE THE SAME NAME " +
                    filesForStorage[i] +
                    " " +
                    filesForStorage[j]
                );
              }
            }
          }

标签: javascriptreactjsloopsif-statementrecursion

解决方案


使用map而不返回任何东西使它几乎毫无意义。您可以使用forEach,但是当您在其中使用双循环时,这同样毫无意义——这意味着您将在foreach(或map在您的情况下)循环一次,然后再循环两次,从而导致令人眼花缭乱的糟糕性能。

您真正想做的是将您的项目分组name,然后选择具有超过 1 个元素的任何组

const filesForStorage = [
{id: 12323, name: 'name'},
{id: 3123, name: 'abc'},
{id: 3213, name: 'name'}
]

const grouped = Object.values(
  filesForStorage.reduce( (a,i) => {
    a[i.name] = a[i.name] || [];
    a[i.name].push(i);
    return a;
  },{})
);

console.log(grouped.filter(x => x.length>1).flat());


推荐阅读