Javascript 使用路径从对象提取数据-在数组中包含所有数据

Javascript 使用路径从对象提取数据-在数组中包含所有数据,javascript,lodash,flatmap,Javascript,Lodash,Flatmap,我试图用LoDash解决以下问题。我知道如何使用for循环来解决这个问题,但我正在寻找解决这个问题的现代函数方法 我有以下数据: const data = { people: [ { name: "Bob", vehicles: [ { model: "Mazda" tires: [

我试图用LoDash解决以下问题。我知道如何使用for循环来解决这个问题,但我正在寻找解决这个问题的现代函数方法


我有以下数据:

const data = {
    people: [
        {
            name: "Bob",
            vehicles: [
                {
                    model: "Mazda"
                    tires: [
                        { pressure: 20 },
                        { pressure: 22 },
                        { pressure: 23 },
                        { pressure: 21 },
                    ]
                },
                {
                    model: "Harley Davidson"
                    tires: [
                        { pressure: 20 }
                        { pressure: 25 }
                    ]
                }
            ]
        },
        {...},
        {...},
        {...},
    ]
}
我想从中提取每个人的每个轮胎压力的列表。比如说:

[20, 22, 23, 21, 20, 25, ... ]
const path = 'people.vehicles[*].tires[*].pressure';
const tirePressure = _.methodName(data, path);
我要找的是一种方法,我可以这样调用:

[20, 22, 23, 21, 20, 25, ... ]
const path = 'people.vehicles[*].tires[*].pressure';
const tirePressure = _.methodName(data, path);

我知道lodash支持一些类似的功能,比如
.at(object,['a[0].b.c','a[1]'),但据我所知,它不支持折叠整个阵列

您可以采用经典的迭代和递归方法,只返回找到的
压力值

功能获取压力(o){
return[].concat(…Object.entries(o).map([key,value])=>
键==‘压力’
价值
:value&&typeof value===“对象”
?获取压力(值)
: []
));
}
var数据={人:[{名字:“鲍勃”,车辆:[{型号:“马自达”,轮胎:[{压力:20},{压力:22},{压力:23},{压力:21}}},{型号:“哈雷戴维森”,轮胎:[{压力:20},{压力:25}]};
控制台日志(获取压力(数据))

.as控制台包装{max height:100%!important;top:0;}
我会用简单的
JS
来完成

使用
.map
获取轮胎值,然后展平此数组

const数据={
人民:[
{
姓名:“鲍勃”,
车辆:[
{
型号:“马自达”,
轮胎:[
{压力:20},
{压力:22},
{压力:23},
{压力:21},
]
},
{
模特:“哈雷戴维森”,
轮胎:[
{压力:20},
{压力:25}
]
}
]
}
]
}
var x=data.people[0].vehicles.map(o=>o.tires.map(i=>i.pressure))

console.log(x.join(“,”).split(“,”)
为了提取属于每个人的每个胎压的列表,您可以使用
减少
并将所有胎压值分组到各自的名称,并使用对象数据结构存储输出:

const data={people:[{name:"Bob",vehicles:[{model:"Mazda",tires:[{pressure:20},{pressure:22},{pressure:23},{pressure:21}]},{model:"Harley Davidson",tires:[{pressure:20},{pressure:25}]}]}]};

const result = data.people.reduce((all, {name, vehicles}) => {

  const pressures  = vehicles.reduce((total, {tires}) => {
    tires.forEach(({pressure}) => total.push(pressure));
    return total;
  }, []);

  all[name] = pressures;

  return all;

}, {});

console.log(result);

你可以用一个简单的方法来实现这一点。这可能会缩短使用时间,但这样就更清楚了

const数据={
人民:[
{
姓名:“鲍勃”,
车辆:[
{
型号:“马自达”,
轮胎:[
{压力:20},
{压力:22},
{压力:23},
{压力:21},
]
},
{
模特:“哈雷戴维森”,
轮胎:[
{压力:20},
{压力:25}
]
}
]
}
]
};
const pressures=uz(data.people)
.flatMap(u.property('vehicles'))
.flatMap(u.property('tires'))
.map(u.property('pressure'))
.value();
控制台日志(压力)