【问题标题】:JS Object Field Extraction from an Array从数组中提取 JS 对象字段
【发布时间】:2021-07-07 05:56:56
【问题描述】:

这是我的产品

[
  {
    "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
    }
  }
]

每个产品都有数量尺寸产品。每个 Product 都有 _idvariant,每个 variant 都有 _id。 我想要一个新的 const 我有的地方

  • 数量
  • 尺寸
  • product._id
  • product.variant_id

喜欢这个

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

or this

我想setOrder,这是一个对象数组,每个对象包含productIdvariantId、产品

的strong>尺寸、数量

我正在使用 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)

【问题讨论】:

    标签: arrays json multidimensional-array immutable.js nested-object


    【解决方案1】:

    您正在创建很多对象,然后再次传播它们,我认为这没有任何用处。对于初学者,可以合并它们。

    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 )。 阴影item 在它的内部函数中。这也是不必要的,因为selectedBasketItemitem(上层范围之一)是同一个对象!。它基本上循环遍历产品,并且对于它找到的每个产品,它都会搜索产品。


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

    Immutable.js 方法是对您的两个对象使用RecordsMaps。 首先在全局某处定义一个记录:

    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);
    

    【讨论】:

      【解决方案2】:
      products.map((item) => {
      let { size, quantity, product } = item;
      let { _id, variant } = product;
      return {
      size,
      quantity,
      productId: _id,
      variantId: variant["_id"]
      };
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多