嵌套json对象中数组过滤器的用法

时间:2019-06-20 02:13:00

标签: javascript arrays json typescript filter

我的目的是引用嵌套的json structure中的特定视图(A,B或C)。

this.selected_table = this.all_tables.views.find(x => x)['A'];

这是使用过滤器的正确方法,因为我发现的所有示例在array.find()中都有一些条件。就我而言,它没有条件就可以工作,但是我觉得array.find()就我而言是不必要的吗?但是,我找不到其他方法。

JSON对象

all_tables = {  
   "views":[  
      {  
         "A":[  
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ],
         "B":[  
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ],
         "C":[  
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ]
      }
   ]
}

2 个答案:

答案 0 :(得分:2)

通常,Array.prototype.find用于根据内部函数是否返回true来查找数组中的特定元素。在您的示例中,您将返回x,它是views数组中的对象,因此其结果为true。因此,您的.find只是返回了views数组中的一个对象(或更具体地说,返回了views数组中的第一个对象)。既然是这种情况,则不需要.find(),而是可以使用其索引直接引用views中的对象:

this.selected_table = this.all_tables.views[0]['A']

请参见以下示例:

all_tables = {  
   "views":[  
      {  
         "A":[  
            {  
               "id":"a",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"a2",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ],
         "B":[  
            {  
               "id":"b",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"b2",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ],
         "C":[  
            {  
               "id":"c",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            },
            {  
               "id":"c2",
               "username":"",
               "status":"",
               "location":"",
               "positionen":[  
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  },
                  {  
                     "field1":"",
                     "field2":"",
                     "field3":""
                  }
               ]
            }
         ]
      }
   ]
};

console.log(all_tables.views[0]['A']);
console.log(all_tables.views[0]['C']);

答案 1 :(得分:0)

.find(x => x)

将返回数组中的第一项为真,否则为false,0,'',未定义或null。

不确定我是否完全遵循您的问题,但是您是否要查找包含A属性的视图,然后返回该属性?

const getProp = (views, prop) => {
  const view = views.find(v => v[prop]);
  //Will return the first view that has a property called prop
  return view && view[prop]; // If it found one return the property
};

然后您就可以使用

const prop = getProp(views, 'A');