【问题标题】:Filtering nested key value pair based on a specific value根据特定值过滤嵌套键值对
【发布时间】:2018-03-15 16:52:27
【问题描述】:

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

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
        }

}

【问题讨论】:

  • 请添加有效数据。
  • 我建议使用 pandas 数据框来处理此类数据
  • @UdayrajDeshmukh 不能以其他方式完成吗?
  • 当然可以!但是这样更容易
  • @UDGogs 有很多方法。您必须提供有效数据和预期输出

标签: javascript angular key-value


【解决方案1】:

这是获取包含您的车辆的所有日期的一种方法,该车辆的 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);

【讨论】:

    【解决方案2】:

    我认为您的主要问题是 @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)
      }
    }

    【讨论】:

      【解决方案3】:

      使用 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; }

      【讨论】:

        【解决方案4】:

        你可以用下面的代码来做。

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

        【讨论】:

          【解决方案5】:

          你可以像这样使用foreach

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

          });

          【讨论】:

            猜你喜欢
            • 2014-08-19
            • 1970-01-01
            • 1970-01-01
            • 2020-03-07
            • 1970-01-01
            • 2023-02-11
            • 1970-01-01
            • 2012-05-14
            • 2018-05-25
            相关资源
            最近更新 更多