Php Lodash:在JSON中获得具有多个匹配项的新数组
我有一个嵌套的JSON,如下所示Php Lodash:在JSON中获得具有多个匹配项的新数组,php,html,arrays,json,lodash,Php,Html,Arrays,Json,Lodash,我有一个嵌套的JSON,如下所示 [ {arrivalTime: "10:30 PM" availableSeats: 23 boardingPoints: [{id: "3882" location: "abc" time: "02:30PM"},{id: "3882" location: "xyz" time: "02:30PM"}] busType: "Scania Metrolink" commPCT: 8 departureTime: "1:15 PM" droppingPoints
[
{arrivalTime: "10:30 PM"
availableSeats: 23
boardingPoints: [{id: "3882"
location: "abc"
time: "02:30PM"},{id: "3882"
location: "xyz"
time: "02:30PM"}]
busType: "Scania Metrolink"
commPCT: 8
departureTime: "1:15 PM"
droppingPoints: null
},
{arrivalTime: "10:30 PM"
availableSeats: 23
boardingPoints: [{id: "3882"
location: "def"
time: "02:30PM"},{id: "3882"
location: "jkl"
time: "02:30PM"}]
busType: "Scania "
commPCT: 8
departureTime: "1:15 PM"
droppingPoints: null
}
]
从这里我想得到一个匹配条件的新数组。
给你
1.在boardingPoints
对象中仅使用用户指定的位置
获取新数组
假设位置值是xyz
,它将只返回带有
仅在boardingPoints
对象中包含位置xyz
输出
{到达时间:“晚上10:30”
可供选择类别:23
登机点:[{id:“3882”
地点:“abc”
时间:“02:30PM”},{id:“3882”
位置:“xyz”
时间:“下午2:30”}]
busType:“斯堪尼亚都市人”
通讯:8
出发时间:“下午1:15”
丢弃点:null
}
假设位置值为xyz
和def
,它应该只返回包含boardingPoints
对象中的上述两个位置的JSON
输出
{到达时间:“晚上10:30”
可供选择类别:23
登机点:[{id:“3882”
地点:“abc”
时间:“02:30PM”},{id:“3882”
位置:“xyz”
时间:“下午2:30”}]
busType:“斯堪尼亚都市人”
通讯:8
出发时间:“下午1:15”
丢弃点:null
},
{到达时间:“晚上10:30”
可供选择类别:23
登机点:[{id:“3882”
位置:“def”
时间:“02:30PM”},{id:“3882”
地点:“jkl”
时间:“下午2:30”}]
busType:“斯堪尼亚”
通讯:8
出发时间:“下午1:15”
丢弃点:null
}
我知道这可以使用lodash
实现,但我不知道如何实现
目前我只知道lodash中的匹配项,但我不知道如何在我的案例中使用它
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
_.filter(users, _.matches({ 'age': 40}));
// → [{ 'user': 'fred', 'age': 40, 'active': false }]
使用javascript中的本机方法是否可能?您可以使用一系列具有某种逻辑的lodash调用来获得预期的结果。大概是这样的:
var _ = require('lodash');
var result = [
{
arrivalTime: "10:30 PM",
availableSeats: 23,
boardingPoints: [{
id: "3882",
location: "abc",
time: "02:30PM"
},{
id: "3882",
location: "xyz",
time: "02:30PM"
}],
busType: "Scania Metrolink",
commPCT: 8,
departureTime: "1:15 PM",
droppingPoints: null,
},
{
arrivalTime: "10:30 PM",
availableSeats: 23,
boardingPoints: [{
id: "3882",
location: "def",
time: "02:30PM"
},{
id: "3882",
location: "jkl",
time: "02:30PM"
}],
busType: "Scania ",
commPCT: 8,
departureTime: "1:15 PM",
droppingPoints: null
}
];
var locations = ['xyz'];
var f = _.filter(result, function(obj) {
var value = _.map(obj.boardingPoints, 'location');
var i, len;
for (i = 0, len = locations.length; i < len; i++) {
if (_.indexOf(value, locations[i]) >= 0) {
return true;
}
}
return false;
});
console.log(f); // result is your eg-a
结果将是你的eg-b
解决方案的另一种方法是使用intersection()链接调用:
var f = _.filter(result, function(obj) {
return _.chain(obj.boardingPoints).map('location').intersection(locations).value().length > 0;
});
谢谢你的回答,还有一个问题假设json是
{name:'aa',age:20},{name:'bb',age:21},{name:'cc',age:21},{name:'dd',age:24}
我想得到与multple name匹配的行例如:如果名称是aa和bb,那么输出将变成{name:'aa',age:20},{name:'bb age:21}我怎样才能修改上面的内容来解决这个问题呢?这个问题好像是这样的:你有答案吗
var f = _.filter(result, function(obj) {
return _.chain(obj.boardingPoints).map('location').intersection(locations).value().length > 0;
});
var result = _.filter(yourArray, function(item) {
return _.size(_.intersection(['xyz', 'def'], _.map(item.boardingPoints, 'location')));
});