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

从ES6中选择的数组中获取总计

  •  0
  • Joseph  · 技术社区  · 2 年前

    我想知道总数 productPrice chosenData 大堆我需要把它和 mainData 只得到它的总价值。我的问题是,我正在变得不确定,我应该怎么做,有没有一个更短的方法来做呢?

      const mainData = [
        {
            "id": "4324",
            "productName": "Apple",
            "productPrice": 250,
        },
        {
            "id": "656546b",
            "productName": "Banana",
            "productPrice": 500,
        },
        {
            "id": "5656",
            "productName": "Soup",
            "productPrice": 800,
        }
    ];
    
    const chosenData = ['5656', '656546b']
      
      const newArray = chosenData.map((value, index) => ({
        productPrice: mainData.find((data) => data.id === value)
      }))
    
    
    console.log(newArray.productPrice)
    6 回复  |  直到 2 年前
        1
  •  2
  •   brk    2 年前

    map 返回一个新数组,它不会跳过任何元素。你可以用 reduce 在reduce回调函数中,使用 find 。如果在maindData中找到具有相同id的元素,它将返回未定义的对象。如果它不是未定义的,则获取该值并将其累加。

    const mainData = [{
        "id": "4324",
        "productName": "Apple",
        "productPrice": 250,
      },
      {
        "id": "656546b",
        "productName": "Banana",
        "productPrice": 500,
      },
      {
        "id": "5656",
        "productName": "Soup",
        "productPrice": 800,
      }
    ];
    
    const chosenData = ['5656', '656546b']
    
    const newArray = chosenData.reduce((acc, curr) => {
    
      const findById = mainData.find(item => item.id === curr);
      findById && (acc += findById.productPrice)
      return acc;
    
    }, 0)
    
    
    console.log(newArray)
        2
  •  2
  •   Kudo    2 年前

    在您的解决方案中,通过map获得的newArray是一个数组,而数组没有该属性 productPrice 所以你没有定义。

    您可以筛选出具有匹配id的对象,然后将其相加,例如:

    mainData.filter(value=>chosenData.includes(value.id)).reduce((acc, cur)=>acc+cur.productPrice, 0)
    
        3
  •  1
  •   Tushar Shahi    2 年前

    你的 newArray 是一个数组。你不能像这样访问它的属性 newArray.productPrice .您想从新数组中计算一个值,以便使用 reduce() .以你的代码为基础

    const mainData = [
        {
            "id": "4324",
            "productName": "Apple",
            "productPrice": 250,
        },
        {
            "id": "656546b",
            "productName": "Banana",
            "productPrice": 500,
        },
        {
            "id": "5656",
            "productName": "Soup",
            "productPrice": 800,
        }
    ];
    
    const chosenData = ['5656', '656546b']
      
      const newSum = chosenData.map((value, index) => ({
        productPrice: mainData.find((data) => data.id === value)
      })).reduce((agg,x) => {
      return agg + x.productPrice.productPrice
      },0);
    
    
    console.log(newSum)

    如果不想让太多属性变得复杂,可以使用以下代码:

    const mainData = [
        {
            "id": "4324",
            "productName": "Apple",
            "productPrice": 250,
        },
        {
            "id": "656546b",
            "productName": "Banana",
            "productPrice": 500,
        },
        {
            "id": "5656",
            "productName": "Soup",
            "productPrice": 800,
        }
    ];
    
    const chosenData = ['5656', '656546b']
      
      const newSum = chosenData.map((value, index) => mainData.find((data) => data.id === value).productPrice).reduce((agg,x) => agg + x,0);
    
    
    console.log(newSum)
        4
  •  0
  •   kaushik94    2 年前

    因为你的 newArray 是一系列经过过滤的产品。Map返回一个数组。可能试着 reduce 它需要计算 productPrice 总的还是什么。但是,代码是错误的 newArray.productPrice

        5
  •  0
  •   St1ggy    2 年前

    你可以减少 mainData 得到 totalPrice 带O(n)

    const mainData = [
        {
            "id": "4324",
            "productName": "Apple",
            "productPrice": 250,
        },
        {
            "id": "656546b",
            "productName": "Banana",
            "productPrice": 500,
        },
        {
            "id": "5656",
            "productName": "Soup",
            "productPrice": 800,
        }
    ];
    
    const chosenData = ['5656', '656546b']
      
    const totalPrice = chosenData.reduce((acc, {id, productPrice}) => {
        if (chosenData.includes(id)) {
            acc += productPrice;
        }
        return acc;
    }, 0)
    
    
    console.log(totalPrice)
    
        6
  •  0
  •   max    2 年前

    我想应该是的

    const newArray = chosenData.map(value => mainData.find(data => data.id === value).productPrice)
    
    console.log(newArray.productPrice)