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

Ste*_*sse 1 javascript arrays react-native

我有一系列javascript对象是产品.这些产品作为购物车显示在列表中.

我想根据_.id值计算数组中重复产品的数量,并从数组中删除这些对象,并使用更新版本和调用count此对象总出现次数的值调用的新密钥进行更新.

到目前为止,我已经尝试了很多方法,我已经搜遍了谷歌,但我发现没有什么可以正确地完成工作.

我将使用的数组类型的示例如下:

[

    {  _id: "5971df93bfef201237985c4d", 
       slug: "5971df93bfef201237985c4d", 
       taxPercentage: 23, 
       totalCost: 9.99, 
       currency: "EUR", 
    },

]
Run Code Online (Sandbox Code Playgroud)

所以我希望我的最终结果是这样的 - 它删除重复的值并用相同的对象替换它,但添加一个名为count的新键,其值为对象最初在数组中的次数:

[

    {  _id: "5971df93bfef201237985c4d", 
       slug: "5971df93bfef201237985c4d", 
       taxPercentage: 23, 
       totalCost: 9.99, 
       currency: "EUR", 
       count: 2, // whatever the count is
    },

]
Run Code Online (Sandbox Code Playgroud)

到目前为止我正在使用这种方法:

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)
}
Run Code Online (Sandbox Code Playgroud)

但它返回如下值:

{filterObj: Array // the array of the duplicates, count: 2}
{filterObj: Array, count: 1}
Run Code Online (Sandbox Code Playgroud)

因为我使用React-Native和列表视图这样的东西不起作用.

它只需要按照之前的方式(数组)存储项目,但需要调用一个新的子项count.

欢迎任何帮助!

Jon*_*lms 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}));
 }
});  
Run Code Online (Sandbox Code Playgroud)

然后重新创建一个数组:

names=[...map.values()];
Run Code Online (Sandbox Code Playgroud)

或者以旧的哈希/数组方式:

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);
Run Code Online (Sandbox Code Playgroud)


tri*_*cot 5

我会坚持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);
Run Code Online (Sandbox Code Playgroud)

如果您拥有多个钥匙,那么一个主意是将它们与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);
Run Code Online (Sandbox Code Playgroud)

  • 这也很有效,更干净,更好的语法 (2认同)