如何在javascript中过滤数组内的嵌套对象

Posted

技术标签:

【中文标题】如何在javascript中过滤数组内的嵌套对象【英文标题】:how to filter an nested objects inside an array in javascript 【发布时间】:2021-05-09 22:44:13 【问题描述】:

我在数组中有以下嵌套对象,我想过滤结果以返回特定项目的 id。

const data = [
   0: id: 1, country: "SA", address: "IOXX",
   1: id:2, country: "SAP", name: "N", address: "IOP",
   2: id:3, country: "S", name: "NO", address: "I",
   3: id:4, country: "SXX", name: "NOI", address: "INDIA",
]

我尝试的解决方案是返回 null,因为我假定嵌套对象结构

var dataREsult =  data.filter(function(el) 
  return el.id == 4;
);

P.S:上面的数据结构来自我正在使用的后端。

我是 javascript 的初学者。任何帮助将不胜感激。

【问题讨论】:

为什么你的数据是这样的结构? @adiga 它是后端的 api 响应... 作为一个没有什么意义的数据结构。它是不必要的嵌套,并且每个内部对象都存在于不一致的键(第一个 0,第二个 1 等)上,因此您必须使用 Object.values() 来获取它。如果可能的话,规范化结构。 @Mitya 有什么可以用代码展示的例子吗? 如果可以更改数据,请更改您的服务器代码。这太荒谬了。当然你可以做return Object.values(el)[0].id === 4。但是,使用该结构很难访问和更新状态。 【参考方案1】:

Array.filter() 回调中使用Object.values()

const data = [
   0: id: 1, country: "SA", address: "IOXX",
   1: id:2, country: "SAP", name: "N", address: "IOP",
   2: id:3, country: "S", name: "NO", address: "I",
   3: id:4, country: "SXX", name: "NOI", address: "INDIA",
]

const result = data.filter(el => Object.values(el)[0].id === 4);

for(var i=data.length-1; i>=0; i--) 
  if(Object.values(data[i])[0].id === 4)
    data.splice(i, 1)



console.log(data);

【讨论】:

感谢 sn-p,如果您以 4 为例,那么只返回 id 值的方法是什么。我打算用它创建一个函数。 同理,你可以把它做成一个函数然后返回。 @JohnD 如果您按id 过滤,为什么要返回id 值? @adiga 在本例中,我试图删除带有id = 4 的项目。我可能以错误的方式接近它,但这是最终目标。 我更新了我的答案,你可以使用array.forEach,并使用array.splice() 删除该项目。 @JohnD

以上是关于如何在javascript中过滤数组内的嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章

动态过滤嵌套javascript对象数组中的数据[重复]

如何让 vuejs 过滤器为数组内的嵌套项工作?

Javascript过滤对象内的数组

映射/挖掘嵌套在对象中的数组 - JavaScript

如何通过猫鼬(javascript)中的多个值查询数组内的对象?

带有 C#Driver 的 MongoDB:如何过滤嵌套对象数组中的字段