javascript/jQUERY 中下划线的 _.invert() 的任何替代项,它可以允许重复键

Any alternate for _.invert() of underscore in javascript/jQUERY which can allow duplicate keys

我需要将现有地图交换键更改为值,并将值更改为键。由于我的地图中的键有重复值,因此我无法使用 underscore library_.invert()

     function map() {
        return {
             'eatables': {
                 apple: 'fruits',
                 orange: 'fruits',
                 guava: 'fruits',
                 brinjal: 'vegetables',
                 beans: 'vegetables',
                 rose: 'flowers',
             }
        }
    }

    var reverseMap = _.invert(map()['eatables']); 
// invert function works for distinct values.
    console.log (reverseMap); 
// which is giving Object {fruits: "guava", vegetables: "brinjal",flowers:"rose"}

但我希望输出为

Object {fruits: ["apple","orange","guava"], vegetables: ["brinjal","beans"], flowers:"rose"}

在任何库中或在 jQuery/javascript.

中的一种简单方法中,任何一种衬垫都适合用于此目的

您可以使用以下代码段:

var reverseMap = {};
$.each(map().eatables, function(k, v){
    if(!reverseMap[v]) reverseMap[v] = [];
    reverseMap[v].push(k);
});

您可以做的是 mapforEach,然后手动反转键和值以将它们推送到一个对象中。 (我推荐 forEach,因为映射函数将 return 一个映射值,在这种情况下,这不是您要执行的操作,可能会造成混淆)

var reverseEatables = {};

_.forEach(array()['eatables'], function(value, key){
  if(!Array.isArray(eatables[value])){
    reverseEatables[value] = []; // verify the attribute in the object exist
  }
    reverseEatables[value].push(key);  
})

如果您想要一个不使用第 3 方库的解决方案,您可以使用 Object.keys() 从原始对象生成一个键数组,然后使用 Array.prototype.reduce 迭代以创建所需的对象。

function invert(srcObj) {
  return Object.keys(srcObj).reduce(function(obj, val) {
    var key = srcObj[val];

    if (!obj[key]) { obj[key] = []; }

    obj[key].push(val);

    return obj;
  }, {});
}

var origObj = {
    'eatables': {
      apple: 'fruits',
      orange: 'fruits',
      guava: 'fruits',
      brinjal: 'vegetables',
      beans: 'vegetables',
    }
  };

var newObj = invert(origObj.eatables);
    
function invert(srcObj) {
  return Object.keys(srcObj).reduce(function(obj, val) {
    var key = srcObj[val];

    if (!obj[key]) { obj[key] = []; }

    obj[key].push(val);

    return obj;
  }, {});
}

document.write('<pre>' + JSON.stringify(newObj, null, 2) + '</pre>');