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);
});
您可以做的是 map
或 forEach
,然后手动反转键和值以将它们推送到一个对象中。 (我推荐 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>');
我需要将现有地图交换键更改为值,并将值更改为键。由于我的地图中的键有重复值,因此我无法使用 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);
});
您可以做的是 map
或 forEach
,然后手动反转键和值以将它们推送到一个对象中。 (我推荐 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>');