代码之家  ›  专栏  ›  技术社区  ›  Chris

如何搜索嵌套的对象数组?

  •  -1
  • Chris  · 技术社区  · 7 年前

    我有这个对象数组,我可以搜索并找到RoomName,但是如何搜索嵌套数组或区域?

    我要用这些名字

    var obj1 = data2.find(o => o.RoomName === 'Room 4');
    console.log(obj1);
    
    var abc = data2[data2.findIndex(x => x.RoomName == "Room 1")];
    console.log(abc);
    
    var foundValue = data2.filter(obj=>obj.RoomName === 'Room 2');
    console.log(foundValue);
    
    console.log(data2.filter(function (arr) { return arr.RoomName == 'Room 4' })[0]);
    

    var obj1 = data2.find(o => o.Areas.AreaName === 'Area 4');
    console.log(obj1);
    

    但那不管用。

    { "RoomID": 4, "RoomName": "Room 4", "Areas": [{ "id": 4, "AreaName": "Area 4" }, { "id": 40, "AreaName": "Area 40" }] }
    

    $(document).ready(function(){
    
    var data2 = [
                { "RoomID": 1, "RoomName": "Room 1", "Areas": [{ "id": 1, "AreaName": "Area 1" }, { "id": 10, "AreaName": "Area 10" }] },
                { "RoomID": 2, "RoomName": "Room 2", "Areas": [{ "id": 2, "AreaName": "Area 2" }, { "id": 20, "AreaName": "Area 20" }] },
                { "RoomID": 3, "RoomName": "Room 3", "Areas": [{ "id": 3, "AreaName": "Area 3" }, { "id": 30, "AreaName": "Area 30" }, { "id": 35, "AreaName": "Area 35" }] },
                { "RoomID": 4, "RoomName": "Room 4", "Areas": [{ "id": 4, "AreaName": "Area 4" }, { "id": 40, "AreaName": "Area 40" }] }
            ];
            
     
      var obj1 = data2.find(o => o.RoomName === 'Room 4');
    	console.log(obj1);
    
    	var abc = data2[data2.findIndex(x => x.RoomName == "Room 1")];
    	console.log(abc);
    
    	var foundValue = data2.filter(obj=>obj.RoomName === 'Room 2');
    	console.log(foundValue);
    
    	console.log(data2.filter(function (arr) { return arr.RoomName == 'Room 4' })[0]);
      
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    4 回复  |  直到 7 年前
        1
  •  0
  •   kyle    7 年前

    这似乎是以前问题的重复。javascript中没有内置的深层对象搜索方法,但是可以使用递归来查找嵌套对象的值。

        2
  •  0
  •   Eddie    7 年前

    你可以用 filter some

    var data2 = [{"RoomID":1,"RoomName":"Room 1","Areas":[{"id":1,"AreaName":"Area 1"},{"id":10,"AreaName":"Area 10"}]},{"RoomID":2,"RoomName":"Room 2","Areas":[{"id":2,"AreaName":"Area 2"},{"id":20,"AreaName":"Area 20"}]},{"RoomID":3,"RoomName":"Room 3","Areas":[{"id":3,"AreaName":"Area 3"},{"id":30,"AreaName":"Area 30"},{"id":35,"AreaName":"Area 35"}]},{"RoomID":4,"RoomName":"Room 4","Areas":[{"id":4,"AreaName":"Area 4"},{"id":40,"AreaName":"Area 40"}]}]
    
    var AreaNameToSearch = 'Area 4';
    var obj1 = data2.find(o => o.Areas.some(x => x.AreaName === AreaNameToSearch));
    
    console.log(obj1);
        3
  •  0
  •   Gerardo BLANCO    7 年前

    您可以创建一个双过滤器,以便在区域上迭代并仅在满足条件时返回。

    var areaObj = data2.filter(o=> {
      return o.Areas.filter(a=>{ 
        return a.AreaName == 'Area 4'
      }).length > 0
    })
    

    希望这有帮助:>

    $(document).ready(function() {
    
      var data2 = [{
          "RoomID": 1,
          "RoomName": "Room 1",
          "Areas": [{
            "id": 1,
            "AreaName": "Area 1"
          }, {
            "id": 10,
            "AreaName": "Area 10"
          }]
        },
        {
          "RoomID": 2,
          "RoomName": "Room 2",
          "Areas": [{
            "id": 2,
            "AreaName": "Area 2"
          }, {
            "id": 20,
            "AreaName": "Area 20"
          }]
        },
        {
          "RoomID": 3,
          "RoomName": "Room 3",
          "Areas": [{
            "id": 3,
            "AreaName": "Area 3"
          }, {
            "id": 30,
            "AreaName": "Area 30"
          }, {
            "id": 35,
            "AreaName": "Area 35"
          }]
        },
        {
          "RoomID": 4,
          "RoomName": "Room 4",
          "Areas": [{
            "id": 4,
            "AreaName": "Area 4"
          }, {
            "id": 40,
            "AreaName": "Area 40"
          }]
        }
      ];
    
    
    var areaObj = data2.filter(o=>o.Areas.filter(a=> a.AreaName == 'Area 4').length > 0)
    
    console.log(areaObj)
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        4
  •  0
  •   Nina Scholz    7 年前

    您可以采用嵌套方法 Array#find 对于外部阵列和 Array#some 对于内部数组。

    Array.find Array.some 返回true。内部回调查找具有给定名称的区域。

    如果这种情况是 true 真的 调用函数,返回带有所需对象的对象。

    var data2 = [{ RoomID: 1, RoomName: "Room 1", Areas: [{ id: 1, AreaName: "Area 1" }, { id: 10, AreaName: "Area 10" }] }, { RoomID: 2, RoomName: "Room 2", Areas: [{ id: 2, AreaName: "Area 2" }, { id: 20, AreaName: "Area 20" }] }, { RoomID: 3, RoomName: "Room 3", Areas: [{ id: 3, AreaName: "Area 3" }, { id: 30, AreaName: "Area 30" }, { id: 35, AreaName: "Area 35" }] }, { RoomID: 4, RoomName: "Room 4", Areas: [{ id: 4, AreaName: "Area 4" }, { id: 40, AreaName: "Area 40" }] }];
        obj1 = data2.find(({ Areas }) => Areas.some(({ AreaName }) => AreaName === "Area 4"));
    
    console.log(obj1);
    .as-console-wrapper { max-height: 100% !important; top: 0; }