根据特定值过滤嵌套键值对

Filtering nested key value pair based on a specific value

第一次做key-value pair mapping,没能接近。我有一个键值对,例如:

trips= {
    date1: [ 
      {
        "id": 1, 
        "Place": "Delhi", 
        "Number": "001",
        "Vehicle": {"id":"veh1", "number": "AN01001"} 
      },
      { 
        "id": 2, 
        "Place": "Bangalore", 
        "Number": "002",
        "Vehicle": {"id":"veh2", "number": "AN01002"}
      },
      { 
        "id": 3, 
        "Place": "Pune", 
        "Number": "003",
        "Vehicle": {"id":"veh3", "number": "AN01003"}
      } 
    ],
    date2: [ 
      {
        "id": 1, 
        "Place": "Lucknow", 
        "Number": "001",
        "Vehicle": {"id":"veh1", "number": "AN01002"} 
      },
      { 
        "id": 3, 
        "Place": "Pune", 
        "Number": "003",
        "Vehicle": {"id":"veh3", "number": "AN01003"}
      } 
    ],
    date3: [ 
      {
        "id": 1, 
        "Place": "Delhi", 
        "Number": "001",
        "Vehicle": {"id":"veh1", "number": "AN01001"} 
      },
      { 
        "id": 2, 
        "Place": "Bangalore", 
        "Number": "002",
        "Vehicle": {"id":"veh2", "number": "AN01002"}
      }
   ]
}

for (date in trips) {
  var places = trips[date]
  for (var i = 0; i < places.length; ++i) {
    var place = places[i]
    console.log('place', place)
    console.log('Vehicle', place.Vehicle)
  }
}

在日期内部,数据以具有键值对的数组形式存储。我需要打印其中车辆 ID 为 "veh2" 的所有日期。我正在尝试遍历数据。但在数组开始的某个点之后找不到正确的方法。

我已经能够遍历一个嵌套的键值对

for (key in trips){
    var value= trips[key]
    for (k in value)
        {
            //further nested logic
        }

}

您可以像这样使用 foreach

trips.foreach((item) =>{
//here item is date1, date2
// then you can do 
item.id = 2; // every stuff you want !!!

});

我认为您的主要问题是错误的结构化数据,正如@Nina Scholz 已经提到的那样,更正后很容易 运行 通过所有内容:

trips= {
    date1: [ 
      {
        "id": 1, 
        "Place": "Delhi", 
        "Number": "001",
        "Vehicle": {"id":"veh1", "number": "AN01001"} 
      },
      { 
        "id": 2, 
        "Place": "Bangalore", 
        "Number": "002",
        "Vehicle": {"id":"veh2", "number": "AN01002"}
      },
      { 
        "id": 3, 
        "Place": "Pune", 
        "Number": "003",
        "Vehicle": {"id":"veh3", "number": "AN01003"}
      } 
    ],
    date2: [ 
      {
        "id": 1, 
        "Place": "Lucknow", 
        "Number": "001",
        "Vehicle": {"id":"veh1", "number": "AN01002"} 
      },
      { 
        "id": 3, 
        "Place": "Pune", 
        "Number": "003",
        "Vehicle": {"id":"veh3", "number": "AN01003"}
      } 
    ],
    date3: [ 
      {
        "id": 1, 
        "Place": "Delhi", 
        "Number": "001",
        "Vehicle": {"id":"veh1", "number": "AN01001"} 
      },
      { 
        "id": 2, 
        "Place": "Bangalore", 
        "Number": "002",
        "Vehicle": {"id":"veh2", "number": "AN01002"}
      }
   ]
}

for (date in trips) {
  var places = trips[date]
  for (var i = 0; i < places.length; ++i) {
    var place = places[i]
    console.log('place', place)
    console.log('Vehicle', place.Vehicle)
  }
}

使用 poper 格式的对象和数组,您可以过滤 id 匹配的单个位置。

var trips = { date1: [{ id: 1, Place: "Delhi", Number: "001", Vehicle: { id: "veh1", number: "AN01001" } }, { id: 2, Place: "Bangalore", Number: "002", Vehicle: { id: "veh2", number: "AN01002" } }, { id: 3, Place: "Pune", Number: "003", Vehicle: { id: "veh3", number: "AN01003" } }], date2: [{ id: 1, Place: "Lucknow", Number: "001", Vehicle: { id: "veh1", number: "AN01002" } }, { id: 3, Place: "Pune", Number: "003", Vehicle: { id: "veh3", number: "AN01003" } }], date3: [{ id: 1, Place: "Delhi", Number: "001", Vehicle: { id: "veh1", number: "AN01001" } }, { id: 2, Place: "Bangalore", Number: "002", Vehicle: { id: "veh2", number: "AN01002" } }] },
    id = "veh2",
    result = Object.keys(trips).reduce(function (r, k) {
        return r.concat(trips[k].filter(function (place) {
            return place.Vehicle.id === id;
        }));
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

您可以使用以下代码完成。

trips = {
    date1: [{
            "id": 1,
            "Place": "Delhi",
            "Number": "001",
            "Vehicle": {
                "id": "veh1",
                "number": "AN01001"
            }
        },
        {
            "id": 2,
            "Place": "Bangalore",
            "Number": "002",
            "Vehicle": {
                "id": "veh2",
                "number": "AN01002"
            }
        },
        {
            "id": 3,
            "Place": "Pune",
            "Number": "003",
            "Vehicle": {
                "id": "veh3",
                "number": "AN01003"
            }
        }
    ],
    date2: [{
            "id": 1,
            "Place": "Lucknow",
            "Number": "001",
            "Vehicle": {
                "id": "veh1",
                "number": "AN01002"
            }
        },
        {
            "id": 3,
            "Place": "Pune",
            "Number": "003",
            "Vehicle": {
                "id": "veh3",
                "number": "AN01003"
            }
        }
    ],
    date3: [{
            "id": 1,
            "Place": "Delhi",
            "Number": "001",
            "Vehicle": {
                "id": "veh1",
                "number": "AN01001"
            }
        },
        {
            "id": 2,
            "Place": "Bangalore",
            "Number": "002",
            "Vehicle": {
                "id": "veh2",
                "number": "AN01002"
            }
        }
    ]
};


var results = [];

for (var date in trips) {
    for (var index = 0; index < trips[date].length; index++) {
        var data = trips[date][index];
        var vehicle = data.Vehicle;

        if (vehicle.number == 'AN01002') {
            results.push(data);
        }
    }
}

console.log(results);

这是获取包含 ID === veh2 车辆的所有日期的一种方法:

const t = Object.entries(trips);
const res = t.filter((dates) => {
  return dates[1].some((d, e) => {
    return d.Vehicle.id == 'veh2'; 
  });
});
console.log(res);

这将为 date1 和 date3(包含 veh2)return 个数组

编辑(版本 2):

这个 return 日期更清晰:

let res = [];
for(let i in trips) {
  const found = trips[i].filter((dates) => dates.Vehicle.id == 'veh2');
  found.length && res.push(trips[i]);
}
console.log(res);