Javascript-计算对象数组中的重复项并将计数存储为新对象
我有一个javascript对象数组,它们是产品。这些产品在列表中显示为购物车 我想根据Javascript-计算对象数组中的重复项并将计数存储为新对象,javascript,arrays,react-native,Javascript,Arrays,React Native,我有一个javascript对象数组,它们是产品。这些产品在列表中显示为购物车 我想根据.id值计算数组中重复产品的数量,并从数组中删除这些对象,并使用更新版本和名为count的新键将其与该对象出现的总次数进行关联 到目前为止,我已经尝试了很多方法,在谷歌上搜索了很多次,但是我没有发现任何方法可以正确地完成这项工作 我将使用的数组类型示例如下: [ { _id: "5971df93bfef201237985c4d", slug: "5971df93bfef201237
.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计数=[]
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
的新子项
欢迎任何帮助 最简单的可能是地图:
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);
您可以使用
array.reduce
方法将原始数组转换为具有所需结构的新数组。
我们只需检查数组中是否存在id,并相应地使用具有count属性的新对象更新数组
让arr=[{
身份证号码:1
}, {
身份证号码:1
}, {
身份证号码:1
}, {
身份证号码:2
}, {
身份证号码:2
}];
让new_arr=arr.reduce((ar,obj)=>{
设布尔=假;
如果(!ar){
ar=[];
}
应收账款(a)=>{
如果(a.id==对象id){
a、 计数++;
布尔=真;
}
});
如果(!bool){
obj.count=1;
ar.push(obj);
}
返回ar;
}, []);
控制台日志(新建)
我会坚持使用reduce
,使用Map
并传播其值以获得最终结果:
const-names=[{{u-id:1},{u-id:1},{u-id:2},{u-id:1}];
const result=[…names.reduce((mp,o)=>{
如果(!mp.has(o._id))mp.set(o._id,{…o,count:0});
mp.get(o._id).count++;
返回mp;
},新映射)。值();
控制台日志(结果)代码>您有一个对象数组,其中相同id的对象多次出现。现在,您需要创建一个数组,该数组将相同的对象组合成一个对象,并添加一个计数属性(指示相同对象出现的次数)。是的,这与对象差不多。赋值(el,{count:1})
修改原始对象。你应该做相反的操作:Object.assign({count:1},el)
,或者,为了处理和覆盖现有的count
属性:Object.assign({},el,{count:1})
@trincot yeah提供了两个解决方案,我认为OP可以选择一个mixin,如果他关心性能或者不改变原有的话。这也很有效,更干净、更好的sytax