如何使用索引和数组对所有对象求和
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);
如何使用索引键对象搜索重复数据这是我的对象:
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);