如何使用索引和数组对所有对象求和

How to sum all Object using index with an arrays

如何使用索引键对象搜索重复数据这是我的对象:

 const obj = {
        product1: { name: 'paper', price: 4 },
        product2: { name: 'ball', price: 2 },
        product3: { name: 'ice-cream', price: 9 }
        product1: { name: 'paper', price: 2 }
    }

我有一个数组

const arr = ["product1", "product2" ]

我只想获取 product1 和 product2 数据,然后将价格加在一起,我的输出结果如下所示 4+2+2 = 8

这是我尝试做的事情

const newArr = _.map(arr, (name:string) => {
    return obj[name]
})

then I sum 

    const sum = newArr.reduce((data, obj)=> data + obj.price, 0);

问题出在 _.map 当我映射数据时,如果我 return 这样的话,它只会得到 1 个产品 1 我想得到 arr[=16 中的所有产品名称=]

###更新####

我将我的对象更改为唯一,但我仍然想使用 arr 来查找一些不确定的词我可以在和对象中使用 includes 或 indexOf 吗?

 const obj = {
        "product1 Hello": { name: 'paper', price: 4 },
        "product2 test": { name: 'ball', price: 2 },
        "product3 Hello3": { name: 'ice-cream', price: 9 }
        "product1 Hello4": { name: 'paper', price: 2 }
    }

您的问题是 obj 永远不会包含密钥 product1 两次。在运行时创建该对象时,product1 的最后一个值就是存储在该对象中的值。即使你有一个带有这两个键的 JSON 对象,当你去解析它时,最后一个键将是值。我能想到做你想做的唯一方法是你需要在创建对象之前更改数据。

您添加了唯一键,这对您没有帮助,因为现在您需要遍历所有键以确保获得所有键。您最好将密钥放在对象中,并使用对象数组。

const obj = [
  {key: 'product1', name: 'paper', price: 4},
  {key: 'product2', name: 'ball', price: 2},
  {key: 'product3', name: 'ice-cream', price: 9},
  {key: 'product1', name: 'paper', price: 2},
]

然后您可以使用 Array.reduce 或其他方法组合这些值。

现在只获取产品 1 和 2 使用过滤器:

const desiredProducts = obj.filter(p => ['product1','product2'].includes(p.key));
``

Or you can combine any matching keys using Array.reduce()

```js
const combinedResult = obj.reduce((cur, acc) => {
  const s = cur.find(c => c.key === acc.key);
  if (s)
    s.price += acc.price;
  else
   cur.push(acc);  

}, []);

JSON 对象不能包含重复键。如果是这样,它将被最后一条记录取代。

在您的情况下,输入变为:

const obj = {
  product1: { name: 'paper', price: 2 },
  product2: { name: 'ball', price: 2 },
  product3: { name: 'ice-cream', price: 9 }
}

您可能的输入如下:

const obj = {
  product1: [{ name: 'paper', price: 4 }, { name: 'paper', price: 2 }],
  product2: [{ name: 'ball', price: 2 }],
  product3: [{ name: 'ice-cream', price: 9 }]
}
const obj = [
  {key: 'product1', name: 'paper', price: 4},
  {key: 'product2', name: 'ball', price: 2},
  {key: 'product3', name: 'ice-cream', price: 9},
  {key: 'product1', name: 'paper', price: 2},
]

更新的答案作为更新的代码:

const obj = {
  "product1 Hello": {name: 'paper', price: 4},
  "product2 test": {name: 'ball', price: 2},
  "product3 Hello3": {name: 'ice-cream', price: 9},
  "product1 Hello4": {name: 'paper', price: 2}
}
const arr = ["product1", "product2"]

let keys = Object.keys(obj).filter(x => arr.some(y => x.includes(y)))
keys.map(x => obj[x].price).reduce((x, y) => x + y, 0)

非 lodash 实现。过滤数组并 运行 reduce

const arr = ["product1", "product2" ]
const obj2 = {
        "product1 Hello": { name: 'paper', price: 4 },
        "product2 test": { name: 'ball', price: 2 },
        "product3 Hello3": { name: 'ice-cream', price: 9 },
        "product1 Hello4": { name: 'paper', price: 2 }
    }
    
 let filtered = Object.entries(obj2).filter((el) => arr.includes(el[0].split(" ")[0]))
 
 const sum = filtered.reduce((acc,curr)=> acc + curr[1].price, 0);
 console.log(sum)

我会使用 Array.prototype.reduce 遍历数组并 return 一个单一的值,即总价。

    const products = {
        id1: { name: "paper", price: 4 },
        id2: { name: "ball", price: 2 },
        id3: { name: "ice-cream", price: 9 },
    };

    const productIds = ["id1", "id2"];

    const totalPrice = productIds.reduce((sum, id) => {
        return sum + products[id].price;
    }, 0);