Javascript 使用路径从对象提取数据-在数组中包含所有数据
我试图用LoDash解决以下问题。我知道如何使用for循环来解决这个问题,但我正在寻找解决这个问题的现代函数方法Javascript 使用路径从对象提取数据-在数组中包含所有数据,javascript,lodash,flatmap,Javascript,Lodash,Flatmap,我试图用LoDash解决以下问题。我知道如何使用for循环来解决这个问题,但我正在寻找解决这个问题的现代函数方法 我有以下数据: const data = { people: [ { name: "Bob", vehicles: [ { model: "Mazda" tires: [
我有以下数据:
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();
控制台日志(压力)代码>