根据特定值过滤嵌套键值对
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);
第一次做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);