Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Lodash:在JSON中获得具有多个匹配项的新数组_Php_Html_Arrays_Json_Lodash - Fatal编程技术网

Php Lodash:在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

我有一个嵌套的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: 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')));
});