2009-07-21 39 views
21

Có bất kỳ phím tắt nào để hoàn thành tương đương với PHP's array_flip trong javascript hay không nó phải được thực hiện thông qua vòng lặp brute force?array_flip trong javascript?

Nó phải được sử dụng cho hàng chục mảng vì vậy ngay cả tăng tốc nhỏ có thể sẽ tăng lên.

Trả lời

19

Đừng nghĩ rằng có tích hợp sẵn. Ví dụ: here, mặc dù :).

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

@pianoman -.. Tôi thêm việc kiểm tra hasOwnProperty Hy vọng bạn không nhớ =) –

+1

Tôi sẽ không khuyên bạn nên phpjs.org: chất lượng mã là underwhelming và một số chức năng không hoạt động trong IE ở tất cả! Nếu bạn muốn lập trình trong JS, hãy tìm hiểu nó! – Christoph

+0

cũng lưu ý rằng điều này chỉ hoạt động đáng tin cậy nếu các giá trị thuộc tính có một biểu diễn chuỗi duy nhất – Christoph

2

với jQuery:

var array_flipped={}; 
$.each(array_to_flip, function(i, el) { 
    array_flipped[el]=i; 
}); 
5

dạng hàm sử dụng tinh khiết ES5. Đối với các trình duyệt cũ sử dụng 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'} 
5

Sử dụng underscore _.invert

_.invert([1, 2]) 
//{1: '0', 2: '1'} 

_.invert({a: 'b', c: 'd'}) 
//{b: 'a', d: 'c'} 
+0

Giải pháp tốt, nhưng làm thế nào bạn đúc giá trị chuỗi, là các chỉ mục mảng, gõ 'số'? Gọi phương thức khác như 'map'? –

+0

@ConAntonakos vâng, tôi đoán '' '_.mapObject (_. Đảo ngược ([1, 2]), hàm (d) {return + d})' '' sẽ làm –

1

Tôi đoán bạn đang nói về đối tượng không mảng

function flip(o){ 
    var newObj = {} 
    Object.keys(o).forEach((el,i)=>{ 
     newObj[o[el]]=el; 
    }); 
    return newObj; 
} 

Nếu không nó có thể là

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; 

} 
+0

Hàm .map không hoạt động tại tất cả, nó chỉ tạo ra một mảng các số tăng dần từ 0 đến length-1 bất kể nội dung mảng. –

+1

Ok cảm ơn sự giúp đỡ của bạn. Tôi vừa chỉnh sửa nó. – redestructa

0

Câu trả lời đầu hiện nay không wo rk như mong đợi đối với tôi vì giá trị khóa được bù trừ +1. . (Và do đó mảng được trả về tmpArr (0) cũng luôn undefined Vì vậy, tôi trừ 1 từ giá trị quan trọng và nó làm việc như mong đợi

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 
}