根据提供的值过滤嵌套键值对
Filtering nested key value pair based on a value provided
我是Angular的新人,第一次做键值对。我正在尝试根据嵌套键值映射中的特定值获取键值对。我有一个嵌套的 JSON 数据格式:
trips = {
"20180201": [{
"journeyId": 1001,
"Number": "001",
"DriverName": "Alex",
"Transporter": {
"id": "T1",
"number": "AN01001",
"Company": "Tranzient"
},
"place": [{
"id": 001,
"value": "Washington DC"
}]
[{
"id": 002,
"value": "Canberra"
}]
}]
[{
"journeyId": 1002,
"Number": "001",
"DriverName": "Tom",
"Transporter": {
"id": "T2",
"number": "AN01002",
"Company": "Trax"
},
"place": [{
"id": 002,
"value": "Canberra"
}]
[{
"id": 004,
"value": "Vienna"
}]
}]
[{
"journeyId": 1003,
"Number": "004",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 001,
"value": "Washington DC"
}]
[{
"id": 004,
"value": "Vienna"
}]
}],
"20180211": [{
"journeyId": 1004,
"Number": "005",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01013",
"Company": "Trax"
},
"place": [{
"id": 005,
"value": "Bridgetown"
}]
[{
"id": 006,
"value": "Ottawa"
}]
[{
"id": 004,
"value": "Vienna"
}]
}]
[{
"journeyId": 1005,
"Number": "005",
"DriverName": "Jerry",
"Transporter": {
"id": "T3",
"number": "AN01020",
"Company": "Trax"
},
"place": [{
"id": 005,
"value": "Bridgetown"
}]
[{
"id": 006,
"value": "Ottawa"
}]
}],
"20180301": [{
"journeyId": 1006,
"Number": "005",
"DriverName": "demy",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 005,
"value": "Bridgetown"
}]
[{
"id": 006,
"value": "Ottawa"
}]
}]};
我正在尝试过滤掉所有具有 place[value]=Vienna 的 trips 键值对。
我的预期输出应该是:
trips = {
"20180201":
[{
"journeyId": 1002,
"Number": "001",
"DriverName":"Tom",
"Transporter": {
"id": "T2",
"number": "AN01002",
"Company": "Trax"
}
"place": [{"id":002,"value":"Canberra" }]
[{"id":004,"value":"Vienna"}]
}]
[{
"journeyId": 1003,
"Number": "004",
"DriverName":"Jack",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
}
"place": [{"id":001,"value":"Washington DC" }]
[{"id":004,"value":"Vienna"}]
}],
"20180211": [{
"journeyId": 1004,
"Number": "005",
"DriverName":"Jack",
"Transporter": {
"id": "T3",
"number": "AN01013",
"Company": "Trax"
}
"place": [{"id":005,"value":"Bridgetown" }]
[{"id":006,"value":"Ottawa"}]
[{"id":004,"value":"Vienna"}]
}]
};
请帮我找到正确的方法。我正在尝试以下功能,但卡在了中间:
for (var date in trips) {
var res={}
for (var index = 0; index < trips[date].length; index++) {
var data = trips[date][index];
//rest of the logic here
}
}
你可以试试这个
const expected = {};
for (let date in trips) {
for (let trip of trips[date]) {
if (trip.place.map(place => place.value).includes('Vienna')) {
expected[date] = trips[date];
}
}
}
一旦您的对象有效,这应该就可以了。
你可以使用 Array.reduce, Array.filter, Array.some and Object.keys
const filteredTrips = Object.keys(trips).reduce((tmp, x) => {
const filtered = trips[x].filter(y => y.place.some(z => z.value === 'Vienna'));
if (filtered.length) {
tmp[x] = filtered;
}
return tmp;
}, {});
const trips = {
"20180201": [{
"journeyId": 1001,
"Number": "001",
"DriverName": "Alex",
"Transporter": {
"id": "T1",
"number": "AN01001",
"Company": "Tranzient"
},
"place": [{
"id": 001,
"value": "Washington DC"
},
{
"id": 002,
"value": "Canberra"
}
],
},
{
"journeyId": 1002,
"Number": "001",
"DriverName": "Tom",
"Transporter": {
"id": "T2",
"number": "AN01002",
"Company": "Trax"
},
"place": [{
"id": 2,
"value": "Canberra"
},
{
"id": 4,
"value": "Vienna"
}
],
},
{
"journeyId": 1003,
"Number": "004",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 1,
"value": "Washington DC",
}, {
"id": 4,
"value": "Vienna",
}],
}
],
"20180211": [{
"journeyId": 1004,
"Number": "005",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01013",
"Company": "Trax"
},
"place": [{
"id": 5,
"value": "Bridgetown"
},
{
"id": 6,
"value": "Ottawa"
},
{
"id": 4,
"value": "Vienna"
}
],
},
{
"journeyId": 1005,
"Number": "005",
"DriverName": "Jerry",
"Transporter": {
"id": "T3",
"number": "AN01020",
"Company": "Trax"
},
"place": [{
"id": 5,
"value": "Bridgetown"
},
{
"id": 6,
"value": "Ottawa"
}
],
}
],
"20180301": [{
"journeyId": 1006,
"Number": "005",
"DriverName": "demy",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 5,
"value": "Bridgetown"
},
{
"id": 6,
"value": "Ottawa"
}
],
}],
};
const filteredTrips = Object.keys(trips).reduce((tmp, x) => {
const filtered = trips[x].filter(y => y.place.some(z => z.value === 'Vienna'));
if (filtered.length) {
tmp[x] = filtered;
}
return tmp;
}, {});
console.log(filteredTrips);
让我们假设作者只是错误输入了输入数据。
这是代码:
function getTripsWithPlaceVanillaJS(trips, place) {
var result = {};
for (var key in trips) {
if (trips.hasOwnProperty(key)) {
var journeys = trips[key];
var filteredJourneys = [];
for (var i = 0; i < journeys.length; i++) {
var journey = journeys[i];
for (var j = 0; j < journey.place.length; j++) {
if (journey.place[i].value === place) {
filteredJourneys.push(journey);
break;
}
}
}
if (filteredJourneys.length) {
result[key] = filteredJourneys;
}
}
}
return result;
}
function getTripsWithPlaceSugaredES6(trips, place) {
return Object.keys(trips).reduce((result, key) => {
const filteredJourneys = trips[key].filter(journey => journey.place.some(item => item.value === place));
if (filteredJourneys.length) {
result[key] = filteredJourneys;
}
return result;
}, {});
}
我是Angular的新人,第一次做键值对。我正在尝试根据嵌套键值映射中的特定值获取键值对。我有一个嵌套的 JSON 数据格式:
trips = {
"20180201": [{
"journeyId": 1001,
"Number": "001",
"DriverName": "Alex",
"Transporter": {
"id": "T1",
"number": "AN01001",
"Company": "Tranzient"
},
"place": [{
"id": 001,
"value": "Washington DC"
}]
[{
"id": 002,
"value": "Canberra"
}]
}]
[{
"journeyId": 1002,
"Number": "001",
"DriverName": "Tom",
"Transporter": {
"id": "T2",
"number": "AN01002",
"Company": "Trax"
},
"place": [{
"id": 002,
"value": "Canberra"
}]
[{
"id": 004,
"value": "Vienna"
}]
}]
[{
"journeyId": 1003,
"Number": "004",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 001,
"value": "Washington DC"
}]
[{
"id": 004,
"value": "Vienna"
}]
}],
"20180211": [{
"journeyId": 1004,
"Number": "005",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01013",
"Company": "Trax"
},
"place": [{
"id": 005,
"value": "Bridgetown"
}]
[{
"id": 006,
"value": "Ottawa"
}]
[{
"id": 004,
"value": "Vienna"
}]
}]
[{
"journeyId": 1005,
"Number": "005",
"DriverName": "Jerry",
"Transporter": {
"id": "T3",
"number": "AN01020",
"Company": "Trax"
},
"place": [{
"id": 005,
"value": "Bridgetown"
}]
[{
"id": 006,
"value": "Ottawa"
}]
}],
"20180301": [{
"journeyId": 1006,
"Number": "005",
"DriverName": "demy",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 005,
"value": "Bridgetown"
}]
[{
"id": 006,
"value": "Ottawa"
}]
}]};
我正在尝试过滤掉所有具有 place[value]=Vienna 的 trips 键值对。
我的预期输出应该是:
trips = {
"20180201":
[{
"journeyId": 1002,
"Number": "001",
"DriverName":"Tom",
"Transporter": {
"id": "T2",
"number": "AN01002",
"Company": "Trax"
}
"place": [{"id":002,"value":"Canberra" }]
[{"id":004,"value":"Vienna"}]
}]
[{
"journeyId": 1003,
"Number": "004",
"DriverName":"Jack",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
}
"place": [{"id":001,"value":"Washington DC" }]
[{"id":004,"value":"Vienna"}]
}],
"20180211": [{
"journeyId": 1004,
"Number": "005",
"DriverName":"Jack",
"Transporter": {
"id": "T3",
"number": "AN01013",
"Company": "Trax"
}
"place": [{"id":005,"value":"Bridgetown" }]
[{"id":006,"value":"Ottawa"}]
[{"id":004,"value":"Vienna"}]
}]
};
请帮我找到正确的方法。我正在尝试以下功能,但卡在了中间:
for (var date in trips) {
var res={}
for (var index = 0; index < trips[date].length; index++) {
var data = trips[date][index];
//rest of the logic here
}
}
你可以试试这个
const expected = {};
for (let date in trips) {
for (let trip of trips[date]) {
if (trip.place.map(place => place.value).includes('Vienna')) {
expected[date] = trips[date];
}
}
}
一旦您的对象有效,这应该就可以了。
你可以使用 Array.reduce, Array.filter, Array.some and Object.keys
const filteredTrips = Object.keys(trips).reduce((tmp, x) => {
const filtered = trips[x].filter(y => y.place.some(z => z.value === 'Vienna'));
if (filtered.length) {
tmp[x] = filtered;
}
return tmp;
}, {});
const trips = {
"20180201": [{
"journeyId": 1001,
"Number": "001",
"DriverName": "Alex",
"Transporter": {
"id": "T1",
"number": "AN01001",
"Company": "Tranzient"
},
"place": [{
"id": 001,
"value": "Washington DC"
},
{
"id": 002,
"value": "Canberra"
}
],
},
{
"journeyId": 1002,
"Number": "001",
"DriverName": "Tom",
"Transporter": {
"id": "T2",
"number": "AN01002",
"Company": "Trax"
},
"place": [{
"id": 2,
"value": "Canberra"
},
{
"id": 4,
"value": "Vienna"
}
],
},
{
"journeyId": 1003,
"Number": "004",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 1,
"value": "Washington DC",
}, {
"id": 4,
"value": "Vienna",
}],
}
],
"20180211": [{
"journeyId": 1004,
"Number": "005",
"DriverName": "Jack",
"Transporter": {
"id": "T3",
"number": "AN01013",
"Company": "Trax"
},
"place": [{
"id": 5,
"value": "Bridgetown"
},
{
"id": 6,
"value": "Ottawa"
},
{
"id": 4,
"value": "Vienna"
}
],
},
{
"journeyId": 1005,
"Number": "005",
"DriverName": "Jerry",
"Transporter": {
"id": "T3",
"number": "AN01020",
"Company": "Trax"
},
"place": [{
"id": 5,
"value": "Bridgetown"
},
{
"id": 6,
"value": "Ottawa"
}
],
}
],
"20180301": [{
"journeyId": 1006,
"Number": "005",
"DriverName": "demy",
"Transporter": {
"id": "T3",
"number": "AN01003",
"Company": "Trax"
},
"place": [{
"id": 5,
"value": "Bridgetown"
},
{
"id": 6,
"value": "Ottawa"
}
],
}],
};
const filteredTrips = Object.keys(trips).reduce((tmp, x) => {
const filtered = trips[x].filter(y => y.place.some(z => z.value === 'Vienna'));
if (filtered.length) {
tmp[x] = filtered;
}
return tmp;
}, {});
console.log(filteredTrips);
让我们假设作者只是错误输入了输入数据。 这是代码:
function getTripsWithPlaceVanillaJS(trips, place) {
var result = {};
for (var key in trips) {
if (trips.hasOwnProperty(key)) {
var journeys = trips[key];
var filteredJourneys = [];
for (var i = 0; i < journeys.length; i++) {
var journey = journeys[i];
for (var j = 0; j < journey.place.length; j++) {
if (journey.place[i].value === place) {
filteredJourneys.push(journey);
break;
}
}
}
if (filteredJourneys.length) {
result[key] = filteredJourneys;
}
}
}
return result;
}
function getTripsWithPlaceSugaredES6(trips, place) {
return Object.keys(trips).reduce((result, key) => {
const filteredJourneys = trips[key].filter(journey => journey.place.some(item => item.value === place));
if (filteredJourneys.length) {
result[key] = filteredJourneys;
}
return result;
}, {});
}