Javascript 如何过滤对象数组,然后返回特定属性?
以数据为例:Javascript 如何过滤对象数组,然后返回特定属性?,javascript,Javascript,以数据为例: let orders = { "data": [ { "email": "a@b.com", "orders": [ { "orderName": "something", "price": "43$" }, { "orderName": "anotherthing", "price": "4$" }
let orders = {
"data": [
{
"email": "a@b.com", "orders": [
{ "orderName": "something", "price": "43$" },
{ "orderName": "anotherthing", "price": "4$" }
]
},{
"email": "c@w.com", "orders": [
{ "orderName": "fish", "price": "43$" },
{ "orderName": "parrot", "price": "4$" }
]
}
]
};
我正在尝试使用一些电子邮件筛选对象的顺序,如:
email = 'a@b.com'
x=orders.data.filter(o =>{if (o.email === email) return o.orders});
但是,整个返回值是整个匹配对象,包括电子邮件和订单,我不想要整个对象,我只想要订单。您不能单独使用
过滤器,您还需要映射
:
orders.data.filter(o => o.email === 'a@b.com').map(o => o.orders)
您不能单独使用过滤器
,还需要映射
:
orders.data.filter(o => o.email === 'a@b.com').map(o => o.orders)
另一种方法是使用查找
,然后在需要时只参考订单
。添加|{'orders':'Email not found'如果找不到电子邮件,则“代码>之后”将被捕获
let orders={
“数据”:[{
“电子邮件”:a@b.com",
“命令”:[{
“订单名称”:“某物”,
“价格”:“43美元”
},
{
“订单名称”:“另一件事”,
“价格”:“4美元”
}
]
}, {
“电子邮件”:c@w.com",
“命令”:[{
“订单名称”:“鱼”,
“价格”:“43美元”
},
{
“订单名称”:“鹦鹉”,
“价格”:“4美元”
}
]
}]
};
电子邮件a@b.com'
x=订单.数据.查找(o=>{
返回o.email==电子邮件
}) || {
“订单”:“未找到电子邮件”
};
控制台日志(x.orders);
电子邮件x@y.com'
x=订单.数据.查找(o=>{
返回o.email==电子邮件
}) || {
“订单”:“未找到电子邮件”
};
控制台日志(x.orders)代码>另一种方法是使用查找
,然后在需要时只参考订单
。添加|{'orders':'Email not found'如果找不到电子邮件,则“代码>之后”将被捕获
let orders={
“数据”:[{
“电子邮件”:a@b.com",
“命令”:[{
“订单名称”:“某物”,
“价格”:“43美元”
},
{
“订单名称”:“另一件事”,
“价格”:“4美元”
}
]
}, {
“电子邮件”:c@w.com",
“命令”:[{
“订单名称”:“鱼”,
“价格”:“43美元”
},
{
“订单名称”:“鹦鹉”,
“价格”:“4美元”
}
]
}]
};
电子邮件a@b.com'
x=订单.数据.查找(o=>{
返回o.email==电子邮件
}) || {
“订单”:“未找到电子邮件”
};
控制台日志(x.orders);
电子邮件x@y.com'
x=订单.数据.查找(o=>{
返回o.email==电子邮件
}) || {
“订单”:“未找到电子邮件”
};
控制台日志(x.orders)
您不能使用.filter
执行此操作,因为该方法仅会返回数组中的一个子部分,而您还需要对其进行变换
您可以使用链接生成结果:
let orders={“data”:[{“email”:”a@b.com“,”订单“:[{“订单名”:“某物”,“价格”:“43$”},{“订单名”:“另一物”,“价格”:“4$”}]},{“电子邮件”:”c@w.com“,”订单“:[{“订单名”:“鱼”,“价格”:“43美元”},{“订单名”:“鹦鹉”,“价格”:“4美元”}]};
电子邮件a@b.com';
x=订单。数据
.filter(o=>o.email==email)
.map(o=>o.orders);
控制台日志(x)
您不能使用.filter
执行此操作,因为该方法仅会返回数组中的一个子部分,而您还需要对其进行变换
您可以使用链接生成结果:
let orders={“data”:[{“email”:”a@b.com“,”订单“:[{“订单名”:“某物”,“价格”:“43$”},{“订单名”:“另一物”,“价格”:“4$”}]},{“电子邮件”:”c@w.com“,”订单“:[{“订单名”:“鱼”,“价格”:“43美元”},{“订单名”:“鹦鹉”,“价格”:“4美元”}]};
电子邮件a@b.com';
x=订单。数据
.filter(o=>o.email==email)
.map(o=>o.orders);
控制台日志(x)代码>
let orders={
“数据”:[
{
“电子邮件”:a@b.com“,“订单”:[
{“orderName”:“某物”,“价格”:“43$”},
{“订单名”:“另一件”、“价格”:“4$”}
]
},{
“电子邮件”:c@w.com“,“订单”:[
{“订单名”:“鱼”,“价格”:“43$”},
{“订单名”:“鹦鹉”,“价格”:“4$”}
]
}
]
};
const filteredOrders=orders.data.map((o)=>o.email=='a@b.com'?o.orders:null).filter(o=>o);
console.log(过滤器安装程序)
let orders={
“数据”:[
{
“电子邮件”:a@b.com“,“订单”:[
{“orderName”:“某物”,“价格”:“43$”},
{“订单名”:“另一件”、“价格”:“4$”}
]
},{
“电子邮件”:c@w.com“,“订单”:[
{“订单名”:“鱼”,“价格”:“43$”},
{“订单名”:“鹦鹉”,“价格”:“4$”}
]
}
]
};
const filteredOrders=orders.data.map((o)=>o.email=='a@b.com'?o.orders:null).filter(o=>o);
console.log(filteredOrders)
为什么不在筛选后映射?可能重复的筛选
只检查函数返回的值是否真实,它不使用它作为结果。为什么不在筛选后映射?可能重复的filter
只检查函数返回的值是否真实,它不使用它作为结果。如果它们位于同一对象中(因为它们具有相同的电子邮件),则订单将包含所有订单。如果同一封邮件中有不同的对象,那么这可能无法让它们成为真主。如果是这样的话,您可能需要考虑处理没有找到电子邮件的情况。目前我相信你的代码会抛出一个错误。如果他们在同一个对象中(因为他们有相同的电子邮件),那么订单将包含所有订单。如果同一封邮件中有不同的对象,那么这可能无法让它们成为真主。如果是这样的话,您可能需要考虑处理没有找到电子邮件的情况。目前我相信你的代码会抛出一个错误。