是否有任何快捷方式可以在JavaScript中完成等效的PHP's array_flip function,还是必须通过强力循环来完成?
它必须用于数十个阵列,所以即使很小的加速也可能会加起来。
答案 0 :(得分:21)
不要认为内置了一个。示例实现here,尽管是:)
。
function array_flip( trans )
{
var key, tmp_ar = {};
for ( key in trans )
{
if ( trans.hasOwnProperty( key ) )
{
tmp_ar[trans[key]] = key;
}
}
return tmp_ar;
}
答案 1 :(得分:7)
使用纯ES5的功能形式。对于旧版浏览器,请使用es5-shim。
var example = {a: 'foo', b: 'bar'};
var flipped = Object.keys(example) //get the keys as an array
.filter(example.hasOwnProperty.bind(example)) //safety check (optional)
.reduce(function(obj, key) { //build up new object
obj[example[key]] = key;
return obj;
}, {}); //{} is the starting value of obj
// flipped is {foo: 'a', bar: 'b'}
答案 2 :(得分:6)
使用underscore _.invert
_.invert([1, 2])
//{1: '0', 2: '1'}
_.invert({a: 'b', c: 'd'})
//{b: 'a', d: 'c'}
答案 3 :(得分:2)
使用jQuery:
var array_flipped={};
$.each(array_to_flip, function(i, el) {
array_flipped[el]=i;
});
答案 4 :(得分:2)
我猜你在谈论的是对象而不是阵列
function flip(o){
var newObj = {}
Object.keys(o).forEach((el,i)=>{
newObj[o[el]]=el;
});
return newObj;
}
否则可能是
function flip(o){
var newObj = {}
if (Array.isArray(o)){
o.forEach((el,i)=>{
newObj[el]=i;
});
} else if (typeof o === 'object'){
Object.keys(o).forEach((el,i)=>{
newObj[o[el]]=el;
});
}
return newObj;
}
答案 5 :(得分:1)
当前的最佳答案对我来说没有达到预期的效果,因为键值偏移+1。 (所以返回的数组tmpArr(0)也总是未定义的。所以我从键值中减去1,它按预期工作。
run() run() run()
答案 6 :(得分:0)
简单的方法
const obj = { a: 'foo', b: 'bar' },
keys = Object.keys(obj),
values = Object.values(obj),
flipped = {};
for(let i=0; i<keys.length; i++){
flipped[values[i]] = keys[i];
}
console.log(flipped);//{foo: "a", bar: "b"}