是否有任何捷徑可以在JavaScript中完成相當於PHP's array_flip的操作?還是必須通過強力循環來完成?array_flip在JavaScript中?
它必須用於數十個陣列,所以即使小的加速度可能會加起來。
是否有任何捷徑可以在JavaScript中完成相當於PHP's array_flip的操作?還是必須通過強力循環來完成?array_flip在JavaScript中?
它必須用於數十個陣列,所以即使小的加速度可能會加起來。
不要以爲內置了一個。示例實現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;
}
與jQuery:
var array_flipped={};
$.each(array_to_flip, function(i, el) {
array_flipped[el]=i;
});
使用純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'}
使用underscore _.invert
_.invert([1, 2])
//{1: '0', 2: '1'}
_.invert({a: 'b', c: 'd'})
//{b: 'a', d: 'c'}
我想你所談論的對象不是數組
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;
}
目前頂級答案沒有我rk與我預期的一樣,因爲關鍵值偏移+1。 (所以返回的數組tmpArr(0)也總是不確定的所以我從關鍵值中減去1和它的工作如預期
function array_flip2 (trans) {
var key
var tmpArr = {}
for (key in trans) {
if (!trans.hasOwnProperty(key)) {
continue
}
tmpArr[trans[parseInt(key)]-1] = (key)
}
return tmpArr
}
@pianoman - 。我加了hasOwnProperty檢查,希望你不介意= ) – 2009-07-21 13:59:16
我不會推薦phpjs.org:代碼質量是令人沮喪的,一些功能在IE中根本不起作用!如果你想用JS編程,學習它! – Christoph 2009-07-21 15:27:06
也請記住,只有屬性值具有唯一的字符串表示形式才能可靠地工作 – Christoph 2009-07-21 15:32:41