我有一系列javascript对象是产品。这些产品作为购物车显示在列表中。
我想根据_.id
值计算数组中重复产品的数量,并从数组中删除这些对象,并使用更新版本和名为count
的新密钥重新发送它们。该对象出现的总次数的值。
到目前为止,我已经尝试了很多方法,并且我在谷歌上搜索过但是我找不到任何可以正常工作的方法。
我将使用的数组类型的示例如下:
[
{ _id: "5971df93bfef201237985c4d",
slug: "5971df93bfef201237985c4d",
taxPercentage: 23,
totalCost: 9.99,
currency: "EUR",
},
]
所以我希望我的最终结果是这样的 - 它删除重复的值并用相同的对象替换它,但添加一个名为count的新键,其值为对象最初的次数在数组中:
[
{ _id: "5971df93bfef201237985c4d",
slug: "5971df93bfef201237985c4d",
taxPercentage: 23,
totalCost: 9.99,
currency: "EUR",
count: 2, // whatever the count is
},
]
到目前为止,我正在使用这种方法:
var count = [];
if (cart.cart.products != undefined) {
let namestUi = {
renderNames(names){
return Array.from(
names.reduce( (counters, object) =>
counters.set(object._id, (counters.get(object._id) || 0) + 1),
new Map() ),
([object, count]) => {
var filterObj = names.filter(function(e) {
return e._id == object;
});
return ({filterObj, count})
}
);
}
};
count = namestUi.renderNames(cart.cart.products);
console.log(count)
}
但它返回如下值:
{filterObj: Array // the array of the duplicates, count: 2}
{filterObj: Array, count: 1}
因为我使用React-Native和列表视图这样的东西不起作用。
它只需要按照之前的方式(数组)存储项目,但需要一个名为count
的新子项。
欢迎任何帮助!
答案 0 :(得分:5)
最简单的可能是地图:
var map=new Map();
names.forEach(function(el){
if(map.has(el["_id"])){
map.get(el["_id"]).count++;
}else{
map.set(el["_id"],Object.assign(el,{count:1}));
}
});
然后重新创建一个数组:
names=[...map.values()];
或者以旧的散列/数组方式:
var hash={},result=[];
names.forEach(function(name){
var id=name["_id"];
if(hash[id]){
hash[id].count++;
}else{
result.push(hash[id]={
count:1,
...name
});
}
});
console.log(result);
答案 1 :(得分:4)
我会坚持reduce
,使用Map
并展开其values
以获得最终结果:
const names = [{ _id: 1 }, { _id: 1}, { _id: 2}, { _id: 1}];
const result = [...names.reduce( (mp, o) => {
if (!mp.has(o._id)) mp.set(o._id, { ...o, count: 0 });
mp.get(o._id).count++;
return mp;
}, new Map).values()];
console.log(result);
如果您有多个密钥,那么一个想法是加入JSON.stringify([ ])
:
const names = [{cat: 1, sub: 1}, {cat: 1, sub: 2}, {cat: 2, sub: 1}, {cat: 1, sub: 1}];
const result = [...names.reduce( (mp, o) => {
const key = JSON.stringify([o.cat, o.sub]);
if (!mp.has(key)) mp.set(key, { ...o, count: 0 });
mp.get(key).count++;
return mp;
}, new Map).values()];
console.log(result);
答案 2 :(得分:1)
您可以使用array.reduce
方法将原始数组转换为具有所需结构的新数组。
我们可以检查数组中是否存在id,并相应地使用具有count属性的新对象更新数组。
let arr = [{
id: 1
}, {
id: 1
}, {
id: 1
}, {
id: 2
}, {
id: 2
}];
let new_arr = arr.reduce((ar, obj) => {
let bool = false;
if (!ar) {
ar = [];
}
ar.forEach((a) => {
if (a.id === obj.id) {
a.count++;
bool = true;
}
});
if (!bool) {
obj.count = 1;
ar.push(obj);
}
return ar;
}, []);
console.log(new_arr);