代码之家  ›  专栏  ›  技术社区  ›  Pengguna

如何展平和合并每个子数组中的嵌套数组

  •  1
  • Pengguna  · 技术社区  · 8 年前

    所以我有这些数据:

    let data = [
      {
        "purchase_id": 1,
        "product": [
          {
            "name": "A",
            "id": 1,
            "transactions": [
              {
                "price": 5,
                "qty": 2
              },
              {
                "price": 10,
                "qty": 2
              }
            ]
          },
          {
            "name": "B",
            "id": 2,
            "transactions": [
              {
                "price": 3,
                "qty": 4
              }
            ]
          }
        ]
      },
      {
        "purchase_id": 2,
        "product": [
          {
            "name": "C",
            "id": 3,
            "transactions": [
              {
                "price": 5,
                "qty": 2
              }
            ]
          },
          {
            "name": "D",
            "id": 4,
            "transactions": [
              {
                "price": 3,
                "qty": 4
              }
            ]
          }
        ]
      }
    ]
    

    我想从每个 data.product.transactions 数据:

    "transactions": [
        {
           "price",
           "qty"
        }
     ]
    

    预期输出为:

    [
      {
        "purchase_id": 1,
        "name": "A",
        "id": 1,
        "price": 5,
        "qty": 2
      },
      {
        "purchase_id": 1,
        "name": "A",
        "id": 1,
        "price": 10,
        "qty": 2
      },
      {
        "purchase_id": 1,
        "name": "B",
        "id": 2,
        "price": 3,
        "qty": 4
      },
      {
        "purchase_id": 2,
        "name": "C",
        "id": 3,
        "price": 5,
        "qty": 2
      },
      {
        "purchase_id": 2,
        "name": "D",
        "id": 4,
        "price": 3,
        "qty": 4
      },
    ]
    

    我曾尝试使用object assign,reduce,但我的代码不起作用。非常感谢。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Ori Drori    8 年前

    使用嵌套 Array.map() 创建对象,以及 spread 进入 Array.concat() 要在每个级别展平子阵列,请执行以下操作:

    const data = [{"purchase_id":1,"product":[{"name":"A","id":1,"transactions":[{"price":5,"qty":2},{"price":10,"qty":2}]},{"name":"B","id":2,"transactions":[{"price":3,"qty":4}]}]},{"purchase_id":2,"product":[{"name":"C","id":3,"transactions":[{"price":5,"qty":2}]},{"name":"D","id":4,"transactions":[{"price":3,"qty":4}]}]}];
    
    const result = [].concat(...data.map(({ purchase_id, product }) => 
      [].concat(...product.map(({ name, id, transactions }) => 
        transactions.map((o) => ({
          purchase_id,
          name,
          id,
          ...o
        })
    )))));
    
    console.log(result);

    如果要避免临时子数组和修饰,请使用嵌套 Array.forEach() 调用,并将创建的对象推送到预定义数组:

    const data = [{"purchase_id":1,"product":[{"name":"A","id":1,"transactions":[{"price":5,"qty":2},{"price":10,"qty":2}]},{"name":"B","id":2,"transactions":[{"price":3,"qty":4}]}]},{"purchase_id":2,"product":[{"name":"C","id":3,"transactions":[{"price":5,"qty":2}]},{"name":"D","id":4,"transactions":[{"price":3,"qty":4}]}]}];
    
    const result = [];
    
    data.forEach(({ purchase_id, product }) => 
      product.forEach(({ name, id, transactions }) => 
        transactions.forEach((o) => result.push({
          purchase_id,
          name,
          id,
          ...o
        })
    )));
    
    console.log(result);
        2
  •  1
  •   Kalamarico Gopakumar AP    8 年前
    var arr = [];
    data.forEach(x => {
      x.product.forEach(y => {
        y.transactions.forEach(z => {
          z["name"] = y.name;
          z["id"] = y.id;
          z["purchase_id"] = x.purchase_id;
          arr.push(z);
        });
      })
    });
    console.log(arr);