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
只检查函数返回的值是否真实,它不使用它作为结果。如果它们位于同一对象中(因为它们具有相同的电子邮件),则订单将包含所有订单。如果同一封邮件中有不同的对象,那么这可能无法让它们成为真主。如果是这样的话,您可能需要考虑处理没有找到电子邮件的情况。目前我相信你的代码会抛出一个错误。如果他们在同一个对象中(因为他们有相同的电子邮件),那么订单将包含所有订单。如果同一封邮件中有不同的对象,那么这可能无法让它们成为真主。如果是这样的话,您可能需要考虑处理没有找到电子邮件的情况。目前我相信你的代码会抛出一个错误。