JavaScript中如何过滤嵌套对象获取sales中amount小于5的商品
正确实现代码
你原有代码的核心问题有两点:
- filter回调中错误访问了全局数组
products的sales属性,应该访问当前遍历到的单个商品对象的sales属性 sales是存储多条销量记录的数组,无法直接读取amount属性,需要遍历该数组做条件判断
如果你的需求是只要存在任意一条销量记录的amount值小于5,就保留对应商品,可以用Array.some()搭配filter实现,代码如下:
const products = [ { id: 1, name: "bread", value: 2.0, category: "bakery", "sales":[{"day": "07/04/2021", "amount": 12}, {"day": "10/04/2021", "amount": 18}] }, { id: 2, name: "apple", value: 6.5, category: "fruit", "sales":[{"day": "07/04/2021", "amount": 4}, {"day": "10/04/2021", "amount": 18}] }, { id: 3, name: "pizza", value: 2.0, category: "food", "sales":[{"day": "07/04/2021", "amount": 5}, {"day": "10/04/2021", "amount": 18}]} , { id: 4, name: "cheese", value: 7.0, category: "bakery", "sales":[{"day": "07/04/2021", "amount": 12}, {"day": "10/04/2021", "amount": 5}] }, { id: 5, name: "milk", value: 2.2, category: "food", "sales":[{"day": "07/04/2021", "amount": 12}, {"dia": "10/04/2021", "amount": 3}]} ]; // 筛选存在任意一次销量小于5的商品 const onlyAmountLess5 = products.filter(product => { return product.sales.some(saleItem => saleItem.amount < 5) }) console.log(onlyAmountLess5) // 输出结果为id=2的apple、id=5的milk两个商品
如果你的需求是商品的所有销量记录的amount值都小于5才保留,把上述代码里的some方法替换为every即可。
逻辑说明
- filter方法遍历整个products数组,对每个商品执行回调函数,回调返回true的商品会被保留到结果数组
- some方法会遍历当前商品的sales数组,只要有一条销量记录满足
amount <5就返回true,否则返回false - every方法会遍历当前商品的sales数组,只有所有销量记录都满足
amount <5才返回true,否则返回false
内容的提问来源于stack exchange,提问作者TulioVargas
相关产品推荐
相关产品推荐

