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

Get Total From a Chosen Array in ES6

我想从 chosenData 数组中得到总数 productPrice。我需要从 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)

因为您的 newArray 是一组过滤后的产品。映射 returns 一个数组。可能尝试 reduce 它来计算 productPrice 总数或其他东西。但是代码在 newArray.productPrice

处是错误的

在你的方案中,通过map得到的newArray是一个数组,而array没有属性productPrice,所以你得到undefined。

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

mainData.filter(value=>chosenData.includes(value.id)).reduce((acc, cur)=>acc+cur.productPrice, 0)

你的newArray是一个数组。您无法像 newArray.productPrice 那样访问它的 属性。你想从你的 newArray 计算一个值,所以你可以使用 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)

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

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)

您可以减少 mainData 并使用 O(n)

得到 totalPrice
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)

我觉得应该是

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

console.log(newArray.productPrice)