2017-02-25 37 views
0

完全删除重复行我有一个JavaScript下面的列表。的JavaScript - 从阵列

var list = [{ 
    ID: "2566", 
    NAME: "ENTERPRISE EXPENSE", 
    EXECUTE: "LOAD_DIMENTION", 
    TYPE: "PROCEDURE" 
    }, 
    { 
    ID: "1234", 
    NAME: "LOAD EXPENSE FACT", 
    EXECUTE: "LOAD_EXPENSE_FACT", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    ID: "RI0031", 
    NAME: "LOAD HEAD COUNT", 
    EXECUTE: "LOAD_HEADCOUNT_FACT", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    NAME: "Not Required", 
    EXECUTE: "Not Required", 
    TYPE: "Not Required" 
    }, 
    { 
    NAME: "Duplicate", 
    EXECUTE: "Duplicate", 
    TYPE: "Duplicate" 
    }, 
    { 
    ID: "RI04", 
    NAME: "CALCULATE FAST", 
    EXECUTE: "FF_CALC", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    NAME: "FORMULAS", 
    EXECUTE: "FF_CALC", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    ID: "RI0031", 
    NAME: "LOAD HEAD COUNT", 
    EXECUTE: "LOAD_HEADCOUNT_FACT", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    ID: "RI04", 
    NAME: "CALCULATE FAST", 
    EXECUTE: "FF_CALC", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    NAME: "FORMULAS", 
    EXECUTE: "FF_CALC", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    ID: "RID005", 
    NAME: "CALCULATE FAST GROUP", 
    EXECUTE: "FF_CALC", 
    TYPE: "STORED PROCEDURE" 
    }, 
    { 
    NAME: "Not Required", 
    EXECUTE: "Not Required", 
    TYPE: "Not Required" 
    }, 
    { 
    NAME: "Duplicate", 
    EXECUTE: "Duplicate", 
    TYPE: "Duplicate" 
    } 
]; 

此列表有许多重复的行。我想删除所有重复的行。

对象可以有更多的10种性质也,所以检查每个属性是不是解决办法。另外,无论我上网的方式是1维阵列还是删除特定属性的重复。 我怎样才能保持一个包含所有行唯一一个列表?

+1

我能想到的,是比较JSON对象的字符串化版本。像这样:'JSON.stringify(obj1)=== JSON.stringify(obj2)'。我猜想这个速度足够快,但元素属性的顺序很重要。这是一个问题吗? – Scalpweb

+0

没有订单不是问题。但即使我将每一行与所有其他行进行比较,这个过程是不是会太慢?随着列表大小的增加,复杂度将增加。 –

+0

“善良的用户”的答案正是我想到的。 JSON.stringify过程是比较JS中2个对象的最快方法。我会说你必须制定一些基准来检查它是否足够快,但它应该没问题。 – Scalpweb

回答

2

the MDN article on JSON.stringify

0不保证非阵列对象的个

属性以任何特定的顺序来字符串化。不要依赖于字符串化中同一对象内的属性排序。

代替比较每个的JSON字符串化的直接对象,应该首先使用Object.entries获得的[key, value]对阵列,并且通过key字符串值排序。不管JSON.stringify的实现如何,这个排序的条目数组可以被安全地字符串化和比较。

注意我下面的例子使用了最新的ES6功能,包括SetObject.entries。要将此代码转换为ES5并运行它,请访问https://babeljs.io/repl/

function deepUnique (array) { 
 
    return [...new Set(array.map(e => JSON.stringify(Object.entries(e).sort(compareEntriesByKey))))].map(e => objectFromEntries(JSON.parse(e))) 
 
} 
 

 
function compareEntriesByKey (a, b) { 
 
    return a[0] < b[0] ? -1 : a[0] === b[0] ? 0 : 1 
 
} 
 

 
function objectFromEntries (entries) { 
 
    let result = {} 
 
    entries.forEach(e => result[e[0]] = e[1]) 
 
    return result 
 
} 
 

 
var list = [{ 
 
    ID: "2566", 
 
    NAME: "ENTERPRISE EXPENSE", 
 
    EXECUTE: "LOAD_DIMENTION", 
 
    TYPE: "PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "1234", 
 
    NAME: "LOAD EXPENSE FACT", 
 
    EXECUTE: "LOAD_EXPENSE_FACT", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RI0031", 
 
    NAME: "LOAD HEAD COUNT", 
 
    EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "Not Required", 
 
    EXECUTE: "Not Required", 
 
    TYPE: "Not Required" 
 
    }, 
 
    { 
 
    NAME: "Duplicate", 
 
    EXECUTE: "Duplicate", 
 
    TYPE: "Duplicate" 
 
    }, 
 
    { 
 
    ID: "RI04", 
 
    NAME: "CALCULATE FAST", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "FORMULAS", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RI0031", 
 
    NAME: "LOAD HEAD COUNT", 
 
    EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RI04", 
 
    NAME: "CALCULATE FAST", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "FORMULAS", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RID005", 
 
    NAME: "CALCULATE FAST GROUP", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "Not Required", 
 
    EXECUTE: "Not Required", 
 
    TYPE: "Not Required" 
 
    }, 
 
    { 
 
    NAME: "Duplicate", 
 
    EXECUTE: "Duplicate", 
 
    TYPE: "Duplicate" 
 
    } 
 
]; 
 

 
console.log(deepUnique(list))

感谢Kind user创建an answer using both JSON and Set之前,我贴我的。

+2

感谢您了解'Object#entries'的工作原理。 –

2

这将从对象的数组中删除确切重复。

var list = [{ ID: "2566", NAME: "ENTERPRISE EXPENSE", EXECUTE: "LOAD_DIMENTION", TYPE: "PROCEDURE" }, 
 
    { ID: "1234", NAME: "LOAD EXPENSE FACT", EXECUTE: "LOAD_EXPENSE_FACT", TYPE: "STORED PROCEDURE" }, 
 
    { ID: "RI0031", NAME: "LOAD HEAD COUNT", EXECUTE: "LOAD_HEADCOUNT_FACT", TYPE: "STORED PROCEDURE" }, 
 
    {NAME: "Not Required", EXECUTE: "Not Required", TYPE: "Not Required"}, 
 
    {NAME: "Duplicate", EXECUTE: "Duplicate", TYPE: "Duplicate"}, 
 
    { ID: "RI04", NAME: "CALCULATE FAST", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, 
 
    { NAME: "FORMULAS", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, 
 
    { ID: "RI0031", NAME: "LOAD HEAD COUNT", EXECUTE: "LOAD_HEADCOUNT_FACT", TYPE: "STORED PROCEDURE" }, 
 
    { ID: "RI04", NAME: "CALCULATE FAST", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, 
 
    { NAME: "FORMULAS", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, 
 
    {ID: "RID005",NAME: "CALCULATE FAST GROUP",EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, 
 
    {NAME: "Not Required", EXECUTE: "Not Required", TYPE: "Not Required"}, 
 
    {NAME: "Duplicate", EXECUTE: "Duplicate", TYPE: "Duplicate"}]; 
 
     
 
var filtered = [...new Set(list.map(v => JSON.stringify(v)))]; 
 

 
console.log(filtered.map(v => JSON.parse(v)));

+0

是的,它的工作很好。感谢您的解决方案。但是,如果对象属性的顺序被改变,那么它引起的问题。 –

0

Stringifies的所有元素,并同时检查是否存在类似的人,然后分析它们。 JSON.stringify()JSON.parse()不是快得令人难以置信,虽然。记住这一点,如果你的物体非常大。

var list = [{ 
 
    ID: "2566", 
 
    NAME: "ENTERPRISE EXPENSE", 
 
    EXECUTE: "LOAD_DIMENTION", 
 
    TYPE: "PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "1234", 
 
    NAME: "LOAD EXPENSE FACT", 
 
    EXECUTE: "LOAD_EXPENSE_FACT", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RI0031", 
 
    NAME: "LOAD HEAD COUNT", 
 
    EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "Not Required", 
 
    EXECUTE: "Not Required", 
 
    TYPE: "Not Required" 
 
    }, 
 
    { 
 
    NAME: "Duplicate", 
 
    EXECUTE: "Duplicate", 
 
    TYPE: "Duplicate" 
 
    }, 
 
    { 
 
    ID: "RI04", 
 
    NAME: "CALCULATE FAST", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "FORMULAS", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RI0031", 
 
    NAME: "LOAD HEAD COUNT", 
 
    EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RI04", 
 
    NAME: "CALCULATE FAST", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "FORMULAS", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    ID: "RID005", 
 
    NAME: "CALCULATE FAST GROUP", 
 
    EXECUTE: "FF_CALC", 
 
    TYPE: "STORED PROCEDURE" 
 
    }, 
 
    { 
 
    NAME: "Not Required", 
 
    EXECUTE: "Not Required", 
 
    TYPE: "Not Required" 
 
    }, 
 
    { 
 
    NAME: "Duplicate", 
 
    EXECUTE: "Duplicate", 
 
    TYPE: "Duplicate" 
 
    } 
 
]; 
 

 
function removeDuplicates(list) { 
 
    return list.reduce(function(memo, obj) { 
 
    var string = JSON.stringify(obj); 
 

 
    if (memo.indexOf(string) === -1) { 
 
     memo.push(string); 
 
    } 
 

 
    return memo; 
 
    }, []).map(function(stringified) { 
 
    return JSON.parse(stringified); 
 
    }); 
 
} 
 

 
list = removeDuplicates(list); 
 
console.log(list);

0

如下片段将通过构建一个哈希映射与JSON字符串化密钥和相应的对象的项目,如值移除重复。通过不对这些值进行字符串化,我们保留它们的引用。所以这里没有使用JSON.parse()操作。

function removeDupes(a){ 
 
    var hash = a.reduce(function(h,o){ 
 
         var os = JSON.stringify(o); 
 
         return h[os] ? h : (h[os] = o, h); 
 
    },{}); 
 
    return Object.keys(hash) 
 
       .map(k => hash[k]); 
 
} 
 

 
var list = [{  ID: "2566", 
 
       NAME: "ENTERPRISE EXPENSE", 
 
      EXECUTE: "LOAD_DIMENTION", 
 
       TYPE: "PROCEDURE" 
 
      }, 
 
      {  ID: "1234", 
 
       NAME: "LOAD EXPENSE FACT", 
 
      EXECUTE: "LOAD_EXPENSE_FACT", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RI0031", 
 
       NAME: "LOAD HEAD COUNT", 
 
      EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "Not Required", 
 
      EXECUTE: "Not Required", 
 
       TYPE: "Not Required" 
 
      }, 
 
      { 
 
       NAME: "Duplicate", 
 
      EXECUTE: "Duplicate", 
 
       TYPE: "Duplicate" 
 
      }, 
 
      { 
 
        ID: "RI04", 
 
       NAME: "CALCULATE FAST", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "FORMULAS", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RI0031", 
 
       NAME: "LOAD HEAD COUNT", 
 
      EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RI04", 
 
       NAME: "CALCULATE FAST", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "FORMULAS", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RID005", 
 
       NAME: "CALCULATE FAST GROUP", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "Not Required", 
 
      EXECUTE: "Not Required", 
 
       TYPE: "Not Required" 
 
      }, 
 
      { 
 
       NAME: "Duplicate", 
 
      EXECUTE: "Duplicate", 
 
       TYPE: "Duplicate" 
 
      } 
 
      ], 
 
    res = removeDupes(list); 
 
console.log(res);

但是,如果你想删除重复项的所有出现,那么你仍然可以做的工作在一个非常相似的时装等;

function removeDupes(a){ 
 
    var hash = a.reduce(function(h,o){ 
 
         var os = JSON.stringify(o); 
 
         return h[os] ? (h[os] = false,h) : (h[os] = o, h); 
 
         },{}); 
 
    return Object.keys(hash) 
 
       .reduce((r,k) => hash[k] === false ? r : r.concat(hash[k]),[]); 
 
} 
 

 
var list = [{  ID: "2566", 
 
       NAME: "ENTERPRISE EXPENSE", 
 
      EXECUTE: "LOAD_DIMENTION", 
 
       TYPE: "PROCEDURE" 
 
      }, 
 
      {  ID: "1234", 
 
       NAME: "LOAD EXPENSE FACT", 
 
      EXECUTE: "LOAD_EXPENSE_FACT", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RI0031", 
 
       NAME: "LOAD HEAD COUNT", 
 
      EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "Not Required", 
 
      EXECUTE: "Not Required", 
 
       TYPE: "Not Required" 
 
      }, 
 
      { 
 
       NAME: "Duplicate", 
 
      EXECUTE: "Duplicate", 
 
       TYPE: "Duplicate" 
 
      }, 
 
      { 
 
        ID: "RI04", 
 
       NAME: "CALCULATE FAST", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "FORMULAS", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RI0031", 
 
       NAME: "LOAD HEAD COUNT", 
 
      EXECUTE: "LOAD_HEADCOUNT_FACT", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RI04", 
 
       NAME: "CALCULATE FAST", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "FORMULAS", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
        ID: "RID005", 
 
       NAME: "CALCULATE FAST GROUP", 
 
      EXECUTE: "FF_CALC", 
 
       TYPE: "STORED PROCEDURE" 
 
      }, 
 
      { 
 
       NAME: "Not Required", 
 
      EXECUTE: "Not Required", 
 
       TYPE: "Not Required" 
 
      }, 
 
      { 
 
       NAME: "Duplicate", 
 
      EXECUTE: "Duplicate", 
 
       TYPE: "Duplicate" 
 
      } 
 
      ], 
 
    res = removeDupes(list); 
 
console.log(res);

+0

我知道有'产生冲突的可能性“不指望这一个”'低,但拜托,这是利用对象的唯一标识时,一个很好的例子是为了。 'var IGNORE = {}'。 。 。 '如果(哈希[K] ===无视){...}' – gyre

+0

@gyre是确保你是正确的,但它只是一个评论十岁上下的代码并不是为生产。 – Redu

+0

我明白了你的观点,但是你会惊讶地发现从SO有多少代码以某种方式将它变成* someone's * production ...... – gyre

0

你可以使用一个哈希表只排序键哈希和使用相同的按键对象的数组。

{ 
    "EXECUTE|ID|NAME|TYPE": [ 
     { ID: "2566", NAME: "ENTERPRISE EXPENSE", EXECUTE: "LOAD_DIMENTION", TYPE: "PROCEDURE" }, 
     { ID: "1234", /* ... */ }, 
     { ID: "RI0031", /* ... */ }, 
     { ID: "RI04", /* ... */ }, 
     { ID: "RID005", /* ... */ } 
    ], 
    "EXECUTE|NAME|TYPE": [ 
     { NAME: "Not Required", EXECUTE: "Not Required", TYPE: "Not Required" }, 
     { NAME: "Duplicate", EXECUTE: "Duplicate", TYPE: "Duplicate" }, 
     { NAME: "FORMULAS", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" } 
    ] 
} 

对于滤波,可以首先检查密钥,加入了与管,在哈希表中,然后,如果发现,迭代哈希表的阵列,并检查所有属性。如果不相等,然后按实际对象的哈希表,并返回true

var list = [{ ID: "2566", NAME: "ENTERPRISE EXPENSE", EXECUTE: "LOAD_DIMENTION", TYPE: "PROCEDURE" }, { ID: "1234", NAME: "LOAD EXPENSE FACT", EXECUTE: "LOAD_EXPENSE_FACT", TYPE: "STORED PROCEDURE" }, { ID: "RI0031", NAME: "LOAD HEAD COUNT", EXECUTE: "LOAD_HEADCOUNT_FACT", TYPE: "STORED PROCEDURE" }, { NAME: "Not Required", EXECUTE: "Not Required", TYPE: "Not Required" }, { NAME: "Duplicate", EXECUTE: "Duplicate", TYPE: "Duplicate" }, { ID: "RI04", NAME: "CALCULATE FAST", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { NAME: "FORMULAS", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { ID: "RI0031", NAME: "LOAD HEAD COUNT", EXECUTE: "LOAD_HEADCOUNT_FACT", TYPE: "STORED PROCEDURE" }, { ID: "RI04", NAME: "CALCULATE FAST", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { NAME: "FORMULAS", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { ID: "RID005", NAME: "CALCULATE FAST GROUP", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { NAME: "Not Required", EXECUTE: "Not Required", TYPE: "Not Required" }, { NAME: "Duplicate", EXECUTE: "Duplicate", TYPE: "Duplicate" }], 
 
    result = list.filter(function (hash) { 
 
     return function (o) { 
 
      var keys = Object.keys(o).sort(), 
 
       key = keys.join('|'); 
 

 
      if (!hash[key]) { 
 
       hash[key] = [o]; 
 
       return true; 
 
      } 
 
      if (!hash[key].some(function (p) { return keys.every(function (k) { return o[k] === p[k]; }); })) { 
 
       hash[key].push(o); 
 
       return true; 
 
      } 
 
     }; 
 
    }(Object.create(null))); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6与Map

var list = [{ ID: "2566", NAME: "ENTERPRISE EXPENSE", EXECUTE: "LOAD_DIMENTION", TYPE: "PROCEDURE" }, { ID: "1234", NAME: "LOAD EXPENSE FACT", EXECUTE: "LOAD_EXPENSE_FACT", TYPE: "STORED PROCEDURE" }, { ID: "RI0031", NAME: "LOAD HEAD COUNT", EXECUTE: "LOAD_HEADCOUNT_FACT", TYPE: "STORED PROCEDURE" }, { NAME: "Not Required", EXECUTE: "Not Required", TYPE: "Not Required" }, { NAME: "Duplicate", EXECUTE: "Duplicate", TYPE: "Duplicate" }, { ID: "RI04", NAME: "CALCULATE FAST", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { NAME: "FORMULAS", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { ID: "RI0031", NAME: "LOAD HEAD COUNT", EXECUTE: "LOAD_HEADCOUNT_FACT", TYPE: "STORED PROCEDURE" }, { ID: "RI04", NAME: "CALCULATE FAST", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { NAME: "FORMULAS", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { ID: "RID005", NAME: "CALCULATE FAST GROUP", EXECUTE: "FF_CALC", TYPE: "STORED PROCEDURE" }, { NAME: "Not Required", EXECUTE: "Not Required", TYPE: "Not Required" }, { NAME: "Duplicate", EXECUTE: "Duplicate", TYPE: "Duplicate" }], 
 
    result = list.filter((map => o => { 
 
     var keys = Object.keys(o).sort(), 
 
      key = keys.join('|'); 
 

 
     if (!map.has(key)) { 
 
      map.set(key, [o]); 
 
      return true; 
 
     } 
 
     if (!map.get(key).some(p => keys.every(k => o[k] === p[k]))) { 
 
      map.get(key).push(o); 
 
      return true; 
 
     } 
 
    })(new Map)); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }