Arrays 从数组中提取JS对象字段

Arrays 从数组中提取JS对象字段,arrays,json,multidimensional-array,immutable.js,nested-object,Arrays,Json,Multidimensional Array,Immutable.js,Nested Object,这是我的产品 [ { "quantity": 8, "size": "S", "product": { "_id": "607283d971fbe12de4e42ebe", "title": "LEVI Denim", "name": "TRUC

这是我的产品

[
  {
    "quantity": 8,
    "size": "S",
    "product": {
      "_id": "607283d971fbe12de4e42ebe",
      "title": "LEVI Denim",
      "name": "TRUCKER JACKET",
      "category": "men",
      "price": 8999,
      "rating": 5,
      "sales": 69,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340131-front-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340131-back-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340131-alt1-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400"
        ],
        "_id": "607283d971fbe12de4e42ecb",
        "variantAvailability": true,
        "size": [
          {
            "_id": "607283d971fbe12de4e42ecc",
            "symbol": "S",
            "stock": 4
          },
          {
            "_id": "607283d971fbe12de4e42ecd",
            "symbol": "L",
            "stock": 13
          }
        ]
      },
      "__v": 0
    }
  },
  {
    "quantity": 8,
    "size": "XL",
    "product": {
      "_id": "607285bf70ce0f0660f199ad",
      "title": "LEVI Denim",
      "name": "SHERPA TRUCKER JACKET",
      "category": "men",
      "price": 10199,
      "rating": 2,
      "sales": 18,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-front-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-back-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-alt6-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-alt1-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=2000&hei=1125"
        ],
        "_id": "607285bf70ce0f0660f199ae",
        "variantAvailability": true,
        "size": [
          {
            "_id": "607285bf70ce0f0660f199af",
            "symbol": "S",
            "stock": 10
          },
          {
            "_id": "607285bf70ce0f0660f199b0",
            "symbol": "L",
            "stock": 33
          },
          {
            "_id": "607285bf70ce0f0660f199b1",
            "symbol": "XL",
            "stock": 1
          }
        ]
      },
      "__v": 0
    }
  },
  {
    "quantity": 8,
    "size": "S",
    "product": {
      "_id": "607285bf70ce0f0660f199ad",
      "title": "LEVI Denim",
      "name": "SHERPA TRUCKER JACKET",
      "category": "men",
      "price": 10199,
      "rating": 2,
      "sales": 18,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-front-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-back-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-alt6-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/163650044-alt1-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=2000&hei=1125"
        ],
        "_id": "607285bf70ce0f0660f199ae",
        "variantAvailability": true,
        "size": [
          {
            "_id": "607285bf70ce0f0660f199af",
            "symbol": "S",
            "stock": 10
          },
          {
            "_id": "607285bf70ce0f0660f199b0",
            "symbol": "L",
            "stock": 33
          },
          {
            "_id": "607285bf70ce0f0660f199b1",
            "symbol": "XL",
            "stock": 1
          }
        ]
      },
      "__v": 0
    }
  },
  {
    "quantity": 8,
    "size": "M",
    "product": {
      "_id": "6072b314af87143c5cd39b32",
      "title": "Levi's Premium",
      "name": "EX-BOYFRIEND SHERPA TRUCKER JACKET",
      "category": "women",
      "price": 12099,
      "rating": 5,
      "sales": 50,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/361370034-front-pdp?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/361370034-back-pdp?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=2000&hei=1125"
        ],
        "_id": "6072b314af87143c5cd39b37",
        "variantAvailability": true,
        "size": [
          {
            "_id": "6072b314af87143c5cd39b38",
            "symbol": "XS",
            "stock": 10
          },
          {
            "_id": "6072b314af87143c5cd39b39",
            "symbol": "M",
            "stock": 33
          },
          {
            "_id": "6072b314af87143c5cd39b3a",
            "symbol": "XL",
            "stock": 1
          }
        ]
      },
      "__v": 0
    }
  },
  {
    "quantity": 8,
    "size": "M",
    "product": {
      "_id": "607283d971fbe12de4e42ebe",
      "title": "LEVI Denim",
      "name": "TRUCKER JACKET",
      "category": "men",
      "price": 8999,
      "rating": 5,
      "sales": 69,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-front-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-back-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-alt1-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400"
        ],
        "_id": "607283d971fbe12de4e42ebf",
        "variantAvailability": true,
        "size": [
          {
            "_id": "607283d971fbe12de4e42ec0",
            "symbol": "XS",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec1",
            "symbol": "S",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec2",
            "symbol": "M",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec3",
            "symbol": "L",
            "stock": 33
          },
          {
            "_id": "607283d971fbe12de4e42ec4",
            "symbol": "XL",
            "stock": 1
          }
        ]
      },
      "__v": 0
    }
  },
  {
    "quantity": 8,
    "size": "M",
    "product": {
      "_id": "607283d971fbe12de4e42ebe",
      "title": "LEVI Denim",
      "name": "TRUCKER JACKET",
      "category": "men",
      "price": 8999,
      "rating": 5,
      "sales": 69,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340134-front-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340134-back-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340134-alt1-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400"
        ],
        "_id": "607283d971fbe12de4e42ec5",
        "variantAvailability": true,
        "size": [
          {
            "_id": "607283d971fbe12de4e42ec6",
            "symbol": "M",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec7",
            "symbol": "L",
            "stock": 44
          },
          {
            "_id": "607283d971fbe12de4e42ec8",
            "symbol": "XL",
            "stock": 1
          },
          {
            "_id": "607283d971fbe12de4e42ec9",
            "symbol": "2XL",
            "stock": 44
          },
          {
            "_id": "607283d971fbe12de4e42eca",
            "symbol": "3XL",
            "stock": 44
          }
        ]
      },
      "__v": 0
    }
  },
  {
    "quantity": 8,
    "size": "L",
    "product": {
      "_id": "607283d971fbe12de4e42ebe",
      "title": "LEVI Denim",
      "name": "TRUCKER JACKET",
      "category": "men",
      "price": 8999,
      "rating": 5,
      "sales": 69,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-front-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-back-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-alt1-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400"
        ],
        "_id": "607283d971fbe12de4e42ebf",
        "variantAvailability": true,
        "size": [
          {
            "_id": "607283d971fbe12de4e42ec0",
            "symbol": "XS",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec1",
            "symbol": "S",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec2",
            "symbol": "M",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec3",
            "symbol": "L",
            "stock": 33
          },
          {
            "_id": "607283d971fbe12de4e42ec4",
            "symbol": "XL",
            "stock": 1
          }
        ]
      },
      "__v": 0
    }
  },
  {
    "quantity": 16,
    "size": "S",
    "product": {
      "_id": "607283d971fbe12de4e42ebe",
      "title": "LEVI Denim",
      "name": "TRUCKER JACKET",
      "category": "men",
      "price": 8999,
      "rating": 5,
      "sales": 69,
      "variant": {
        "img": [
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-front-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1250&hei=1667",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-back-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400",
          "https://lsco.scene7.com/is/image/lsco/levis/clothing/723340144-alt1-pdp.jpg?fmt=jpeg&qlt=70,1&op_sharpen=0&resMode=sharp2&op_usm=0.8,1,10,0&fit=crop,0&wid=1050&hei=1400"
        ],
        "_id": "607283d971fbe12de4e42ebf",
        "variantAvailability": true,
        "size": [
          {
            "_id": "607283d971fbe12de4e42ec0",
            "symbol": "XS",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec1",
            "symbol": "S",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec2",
            "symbol": "M",
            "stock": 10
          },
          {
            "_id": "607283d971fbe12de4e42ec3",
            "symbol": "L",
            "stock": 33
          },
          {
            "_id": "607283d971fbe12de4e42ec4",
            "symbol": "XL",
            "stock": 1
          }
        ]
      },
      "__v": 0
    }
  }
]
每种产品都有数量尺寸产品。每个产品都有\u id变体,每个变体都有\u id。 我想要一个新的康斯特

  • 数量
  • 大小
  • 产品。\u id
  • 产品。变量\u id
像这样

{
  "productId": "607283d971fbe12de4e42ebe",
  "variantId": "607283d971fbe12de4e42ebf",
  "size": "S",
  "quantity": 16
}

我想设置订单,它是一个对象数组,每个对象都包含所有产品的productId、variantId、大小、数量

我在用React。这是我的代码,到目前为止我都能做到。我想以不变的方式来做

function getOrderInfo(product){

        //console.log(JSON.stringify(product,null,2))

        product.forEach( (item, index) => {        
            const selectedBasketItem = product.find((item, ind)=> ind === index ) 
            const currentProductId = {productId:selectedBasketItem.product._id}
            const currentVariantId = {variantId:selectedBasketItem.product.variant._id}
            const quan = {quantity:selectedBasketItem.quantity}
            const size = {size:selectedBasketItem.size}
            const payload = {...currentProductId, ...currentVariantId, ...size, ...quan}
            
            
            setOrder({...order,...payload})

        })
        
    }
    getOrderInfo(basket)

您正在创建许多对象,然后将它们再次展开,我认为这没有任何用处。首先,他们可能会合并

const currentProductId = {productId:selectedBasketItem.product._id}
const currentVariantId = {variantId:selectedBasketItem.product.variant._id}
const quan = {quantity:selectedBasketItem.quantity}
const size = {size:selectedBasketItem.size}
const payload = {...currentProductId, ...currentVariantId, ...size, ...quan}

const payload = {
  productId:selectedBasketItem.product._id
  variantId:selectedBasketItem.product.variant._id,
  quantity:selectedBasketItem.quantity,
  size:selectedBasketItem.size
}
线路
const selectedBasketItem=product.find((item,ind)=>ind==index)
。 阴影
项目
在其内部功能中。它也是不必要的,因为
selectedBasketItem
item
(上部范围之一)是同一个对象!。它基本上通过产品进行循环,并为找到的每个产品搜索产品


现在让我们深入实际任务:

js的方法是对两个对象使用或。 首先定义一个记录:

const OrderProduct = Immutable.Record({
  productId: null,
  variantId: null,
  size: null,
  quantity,
});
然后,您可以创建记录:

products.forEach((item) => {
  const mutableData = {
      productId:selectedBasketItem.product._id
      variantId:selectedBasketItem.product.variant._id,
      quantity:selectedBasketItem.quantity,
      size:selectedBasketItem.size
  };
  const payloadRecord = OrderProduct(mutableData);
  // ... do something
});
如果
setOrder
需要一个数组(或者更好的是一个
Immutable.List
),您可以使用
array.map
将产品对象转换为OrderProduct:

const arrayOfProducts = products.map((item) => {
  // build payloadRecord as above
  return payloadRecord;
}
// To turn it into an Immutable.List: 
// const myList = Immutable.List(arrayOfProducts);
setOrder(arrayOfProducts);

请添加一个解释。看见
products.map((item) => {
let { size, quantity, product } = item;
let { _id, variant } = product;
return {
size,
quantity,
productId: _id,
variantId: variant["_id"]
};