Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-计算对象数组中的重复项并将计数存储为新对象_Javascript_Arrays_React Native - Fatal编程技术网

Javascript-计算对象数组中的重复项并将计数存储为新对象

Javascript-计算对象数组中的重复项并将计数存储为新对象,javascript,arrays,react-native,Javascript,Arrays,React Native,我有一个javascript对象数组,它们是产品。这些产品在列表中显示为购物车 我想根据.id值计算数组中重复产品的数量,并从数组中删除这些对象,并使用更新版本和名为count的新键将其与该对象出现的总次数进行关联 到目前为止,我已经尝试了很多方法,在谷歌上搜索了很多次,但是我没有发现任何方法可以正确地完成这项工作 我将使用的数组类型示例如下: [ { _id: "5971df93bfef201237985c4d", slug: "5971df93bfef201237

我有一个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计数=[]

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