Javascript 基于特定值筛选嵌套的键值对

Javascript 基于特定值筛选嵌套的键值对,javascript,angular,key-value,Javascript,Angular,Key Value,我是第一次做键值对映射,但无法接近。我有一个键值对,如: trips= { date1: [ { "id": 1, "Place": "Delhi", "Number": "001", "Vehicle": {"id":"veh1", "number": "AN01001"} }, { "id": 2, "Place": "Bangalore",

我是第一次做键值对映射,但无法接近。我有一个键值对,如:

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)
  }
}

您可以像这样使用foreach:

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

}))

我认为您的主要问题是@Nina Scholz已经提到的错误的结构化数据,当纠正此问题时,运行所有内容都非常容易:

trips={
日期1:[
{
“id”:1,
“地点”:“德里”,
“编号”:“001”,
“车辆”:{“id”:“veh1”,“编号”:“AN01001”}
},
{ 
“id”:2,
“地点”:“班加罗尔”,
“编号”:“002”,
“车辆”:{“id”:“veh2”,“编号”:“AN01002”}
},
{ 
“id”:3,
“地点”:“浦那”,
“编号”:“003”,
“车辆”:{“id”:“veh3”,“编号”:“AN01003”}
} 
],
日期2:[
{
“id”:1,
“地点”:“勒克瑙”,
“编号”:“001”,
“车辆”:{“id”:“veh1”,“编号”:“AN01002”}
},
{ 
“id”:3,
“地点”:“浦那”,
“编号”:“003”,
“车辆”:{“id”:“veh3”,“编号”:“AN01003”}
} 
],
日期3:[
{
“id”:1,
“地点”:“德里”,
“编号”:“001”,
“车辆”:{“id”:“veh1”,“编号”:“AN01001”}
},
{ 
“id”:2,
“地点”:“班加罗尔”,
“编号”:“002”,
“车辆”:{“id”:“veh2”,“编号”:“AN01002”}
}
]
}
用于(行程中的日期){
var地点=行程[日期]
对于(变量i=0;i}
使用poper格式的对象和数组,您可以筛选id匹配的单个位置

var trips={date1:[{id:1,地点:“德里”,编号:“001”,车辆:{id:veh1,编号:“AN01001”},{id:2,地点:“班加罗尔”,编号:“002”,车辆:{id:veh2,编号:“AN01002”},{id:3,地点:“浦那”,编号:“003”,车辆:{id:veh3,编号:“AN01003”},日期2:[{id:1,地点:“勒克瑙”,编号:“001”,车辆:{id:“veh1”,编号:“AN01002”},{id:3,地点:“普纳”,编号:“003”,车辆:{id:“veh3”,编号:“AN01003”}],日期3:[{id:1,地点:“德里”,编号:“001”,车辆:{id:“veh1”,编号:“AN01001”},{id:2,地点:“班加罗尔”,编号:“002”,车辆:{id:“veh2”,编号:“AN01002”},
id=“veh2”,
结果=对象。键(行程)。减少(功能(r,k){
返回r.concat(跳闸[k]。过滤器(功能(位置){
返回地点.Vehicle.id==id;
}));
}, []);
console.log(结果);

。作为控制台包装{max height:100%!important;top:0;}
您可以使用以下代码完成此操作

trips={
日期1:[{
“id”:1,
“地点”:“德里”,
“编号”:“001”,
“车辆”:{
“id”:“veh1”,
“编号”:“AN01001”
}
},
{
“id”:2,
“地点”:“班加罗尔”,
“编号”:“002”,
“车辆”:{
“id”:“veh2”,
“编号”:“AN01002”
}
},
{
“id”:3,
“地点”:“浦那”,
“编号”:“003”,
“车辆”:{
“id”:“veh3”,
“编号”:“AN01003”
}
}
],
日期2:[{
“id”:1,
“地点”:“勒克瑙”,
“编号”:“001”,
“车辆”:{
“id”:“veh1”,
“编号”:“AN01002”
}
},
{
“id”:3,
“地点”:“浦那”,
“编号”:“003”,
“车辆”:{
“id”:“veh3”,
“编号”:“AN01003”
}
}
],
日期3:[{
“id”:1,
“地点”:“德里”,
“编号”:“001”,
“车辆”:{
“id”:“veh1”,
“编号”:“AN01001”
}
},
{
“id”:2,
“地点”:“班加罗尔”,
“编号”:“002”,
“车辆”:{
“id”:“veh2”,
“编号”:“AN01002”
}
}
]
};
var结果=[];
对于(trips中的var日期){
对于(var索引=0;索引<行程[date]。长度;索引++){
var数据=行程[日期][指数];
var车辆=数据车辆;
如果(车辆编号==“AN01002”){
结果:推送(数据);
}
}
}

console.log(结果);
这里有一种方法可以获取包含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)的数组

编辑(版本2):

这将返回更清晰的日期:

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);

请添加有效数据。我建议使用熊猫数据帧来处理此类数据data@UdayrajDeshmukh难道不能用其他方法吗?当然可以!但这要容易得多way@UDGogs有很多方法。你必须给出一个有效的数据和预期的输出
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);