【问题标题】:Javascript filter values of nested objects / arrays [closed]Javascript过滤嵌套对象/数组的值[关闭]
【发布时间】:2022-01-09 04:53:02
【问题描述】:

我正在尝试过滤嵌套对象的值,并根据结果重建它。我在穿过这个物体时遇到了很多麻烦,但我已经接近了这么远。对象如下所示:

var files = {
    "All": [
        {
            "isPublic": true,
            "Files": [
                {
                  "Filename": "A",
                  "Download": true
                },
               {
                  "Filename": "B",
                  "Download": true
                }
            ]
        },
       {
            "isPublic": true,
            "Files": [
                {
                  "Filename": "A",
                  "Download": true
                }
            ]
        },
      {
            "isPublic": false,
            "Files": [
                {
                  "Filename": "C",
                  "Download": false,
                }
            ]
        }
      ]
};

我想在这个数组中找到所有具有文件名的文件:

var filenames = ["A","C"];

我试过(ES5):

test = files['All'].filter(function (obj) {
  return obj.Files.some(function (file) {
    if(arr.includes(file.Filename)) {
      return file.Filename;
    }
  });
});

console.log(test);

结果是:

[[object Object] {
  Files: [[object Object] {
  Download: true,
  Filename: "A"
}, [object Object] {
  Download: true,
  Filename: "B"
}],
  isPublic: true
}, [object Object] {
  Files: [[object Object] {
  Download: true,
  Filename: "A"
}],
  isPublic: true
}, [object Object] {
  Files: [[object Object] {
  Download: false,
  Filename: "C"
}],
  isPublic: false
}]

当Files 中只有一个文件名时,这就像一个魅力。但正如您在第一个对象中看到的那样,有时会有多个文件名。它失败了,因为在结果中也返回了 B。以下部分不应退回。

[object Object] {
      Download: true,
      Filename: "B"
    }],

知道如何实现这一目标吗?

我在这里打开了一个 JS-bin:https://jsbin.com/goyamumuve/1/edit?js,console

【问题讨论】:

  • “我试过过滤器、循环成循环、地图等” 请展示你的尝试。你应该检查some。
  • 你能告诉我们预期的输出吗?
  • 您是要过滤文件数组,还是通过包含在文件数组中来过滤顶级数组?
  • 这与 JSON 有什么关系?该代码不是有效的 JSON,即使没有 var files = 和 ;
  • 我建议提出一个新问题。这个问题被否决,关闭,回答并且有一个接受的答案。无法添加答案(因为它已关闭)并且大多数人认为,这里的问题已解决(因为已接受答案)。

标签: javascript arrays object filter


【解决方案1】:

您可以在 Files 属性中检查数组:

files['All'].filter(obj => obj.Files.some(file => file.Filename === "A"));

更新:

如果您需要避免嵌套数组中与您的条件不匹配的文件 - 过滤嵌套数组。

const filteredFiles = files['All'].map(item => {
  const files = item.Files.filter(file => file.Filename === 'A');
  return files.lenght ? {...item, Files: files} : null;
}).filter(item => Boolean(item));

【讨论】:

  • 什么是any?它来自哪里?
  • 其他语言的错字。我的意思是 Array.prototype.some。固定
  • @AlexGor 帮了大忙,谢谢!我还有一个小问题。它发现了许多结果。我已经编辑了这个问题。您有什么建议吗?
  • @AlexGor 谢谢,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2019-08-10
  • 2021-05-16
相关资源
最近更新 更多