根据嵌套数组对象中的条件获取对象值

Get object value based on conditions within nested array objects

我有一个名为 orders:

的对象数组
    const orders = [
    {
        "order_id": 47445,
        "order_type": "Wholesale",
        "items": [
            {
                "id": 9,
                "department": "Womens",
                "type": "Dress",
                "quantity": 4,
                "detail": {
                    "ID": 13363,
                    "On Sale": 1,
                }
            }
        ]
    }
];

我需要在 order_type(批发)和 items.detail.ID(13363)匹配时获取数量。

到目前为止我已经尝试了以下方法:

const result = orders.find(item => item.order_type == "Wholesale").items
  .reduce((total, item) => {
    if(item.detail.ID == 13363) {
      return item.quantity;
    }
  }, 0);

其中 result 正确 returns 4

我的问题,我确定我遗漏了一些非常简单的事情,就是当我的 orders 数组中有多个 items 时,它会失败。

 const orders = [
    {
        "order_id": 47445,
        "order_type": "Wholesale",
        "items": [
            {
                "id": 9,
                "department": "Womens",
                "type": "Dress",
                "quantity": 4,
                "detail": {
                    "ID": 13363,
                    "On Sale": 1,
                }
            },
            {
                "id": 56,
                "department": "Womens",
                "type": "Skirt",
                "quantity": 12,
                "detail": {
                    "ID": 76884,
                    "On Sale": 0,
                }
            },
            {
                "id": 89,
                "department": "Mens",
                "type": "Shirts",
                "quantity": 20,
                "detail": {
                    "ID": 98223,
                    "On Sale": 1,
                }
            }
        ]
    }
];

一样

const result = orders.find(item => item.order_type == "Wholesale").items
  .reduce((total, item) => {
    if(item.detail.ID == 13363) {
      return item.quantity;
    }
  }, 0);

returns undefined

谢谢

您可以在订单数组上使用 Array.find() 来查找正确的订单,搜索第一个与 order_type 匹配并且具有与所需 itemId 匹配的项目的订单(使用 Array.some()).

如果这个订单存在,我们可以再次使用.find()找到对应的商品数量,

const orders = [ { "order_id": 47445, "order_type": "Wholesale", "items": [ { "id": 9, "department": "Womens", "type": "Dress", "quantity": 4, "detail": { "ID": 13363, "On Sale": 1, } }, { "id": 56, "department": "Womens", "type": "Skirt", "quantity": 12, "detail": { "ID": 76884, "On Sale": 0, } }, { "id": 89, "department": "Mens", "type": "Shirts", "quantity": 20, "detail": { "ID": 98223, "On Sale": 1, } } ] } ] 

function findItemQuantity(orders, orderType, itemId) {
    // Find the first order with the right order_type and containing the right item id
    const order = orders.find(order => order.order_type = orderType && order.items.some(item => item.detail.ID === itemId));
    if (!order) { 
        return null;
    }
    const item = order.items.find(item => item.detail.ID === itemId);
    if (!item) { 
        return null;
    }
    return item.quantity;
}

console.log("Quantity found:", findItemQuantity(orders, 'Wholesale', 13363))
console.log("Quantity found:", findItemQuantity(orders, 'Wholesale', 76884))
    

不确定用例,但现在开始

const result = orders.find(item => item.order_type == "Wholesale").items
  .reduce((total, item) => {
    if (item.detail.ID == 13363) {
      total += item.quantity;
    }
    return total
  }, 0);
const result = orders
  .filter(order => order.order_type == "Wholesale")
  .map(order => order.items.find(item => item.detail.ID == 13363))
  .filter(item => item)
  .reduce((total, { quantity }) => quantity + total, 0);

find 助手只是 return 的第一个匹配项,因此您需要使用另一个助手,例如 filter,如下所示:

const ID = 13363;

const result = orders
  .filter((order) => order.order_type === 'Wholesale')
  .reduce((acc, curr) => {
    const items = curr.items.filter((item) => item.detail.ID === ID);
    console.log(items);
    // You can sum the matching items and then push them into the acc array
    const quantity = items.reduce((sum, item) => (sum += item.quantity), 0);
    acc.push(quantity);
    return acc;
  }, []);

这将 return 一组匹配数量。

const orders = [{
  "order_id": 47445,
  "order_type": "Wholesale",
  "items": [{
    "id": 9,
    "department": "Womens",
    "type": "Dress",
    "quantity": 4,
    "detail": {
      "ID": 13363,
      "On Sale": 1,
    }
  }]
}];

var result = null;
const result2 = orders.find(item => item.order_type == "Wholesale").items
  .map((item) => {
    if (item.detail.ID == 98223) {
      result = item.quantity;
    }
  }, 0);


console.log("result", result)

您甚至可以创建一个函数来使搜索动态化。

const orders = [
{
    "order_id": 47445,
    "order_type": "Wholesale",
    "items": [
        {
            "id": 9,
            "department": "Womens",
            "type": "Dress",
            "quantity": 4,
            "detail": {
                "ID": 13363,
                "On Sale": 1,
            }
        },
        {
            "id": 56,
            "department": "Womens",
            "type": "Skirt",
            "quantity": 12,
            "detail": {
                "ID": 76884,
                "On Sale": 0,
            }
        },
        {
            "id": 89,
            "department": "Mens",
            "type": "Shirts",
            "quantity": 20,
            "detail": {
                "ID": 98223,
                "On Sale": 1,
            }
        }
    ]
}
];

findMyItem=( ID )=>{
var result  = null  ; 
const result2 = orders.find(item => item.order_type == "Wholesale").items
  .map((  item) => {
    if(item.detail.ID == ID ) {
      result = item.quantity;
    }
  }, 0);
  return result ; 
  
}


  
  
    
  console.log( "result" ,findMyItem(  13363 )   ) 
  console.log( "result" ,findMyItem(  98223)   ) 
  console.log( "result" ,findMyItem(  76884)   ) 

const orders = [{
    "order_id": 47445,
    "order_type": "Wholesale",
    "items": [{
      "id": 9,
      "department": "Womens",
      "type": "Dress",
      "quantity": 4,
      "detail": {
        "ID": 13363,
        "On Sale": 1,
      }
    }]
  },
  {
    "order_id": 47445,
    "order_type": "Whole",
    "items": [{
      "id": 9,
      "department": "Womens",
      "type": "Dress",
      "quantity": 4,
      "detail": {
        "ID": 13363,
        "On Sale": 1,
      }
    }]
  }
]

const result = orders.reduce(v => {
  return v.items.map(a => {
    if (v.order_type == 'Wholesale' && a.detail.ID == 13363) {
      return v
    }
  })
})
console.log(result)