2009-07-21 4 views
21

Existe-t-il un raccourci pour accomplir l'équivalent de PHP's array_flip en javascript ou faut-il le faire via une boucle de force brute?array_flip en javascript?

Il doit être utilisé pour des dizaines de réseaux, donc même les petites accélérations s'additionneront probablement.

Répondre

19

Ne pense pas qu'il y en a un intégré. Exemple d'implémentation here, bien que :).

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 -.. J'ai ajouté le chèque hasOwnProperty vous Espérons que ne vous dérange pas = –

+1

Je ne recommanderais pas phpjs.org: la qualité du code est décevante et certaines fonctions ne fonctionnent pas dans IE du tout! Si vous voulez programmer en JS, apprenez-le! – Christoph

+0

gardez également à l'esprit que cela ne fonctionne de manière fiable que si les valeurs de la propriété ont une représentation de chaîne unique – Christoph

2

avec jQuery:

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

forme fonctionnelle en utilisant ES5 pur. Pour les anciens navigateurs, utilisez 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

En utilisant underscore _.invert

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

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

Bonne solution, mais comment transtyper la valeur de la chaîne, qui sont les indices du tableau, tapez 'number'? Appelez une autre méthode comme 'map'? –

+0

@ConAntonakos oui, je suppose que '' _.mapObject (_. Inverser ([1, 2]), la fonction (d) {return + d}) '' 'fera –

1

Je suppose que vous parlez d'objets non tableaux

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

Sinon, il pourrait être

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

La fonction .map ne fonctionne pas à tous, il crée uniquement un tableau de nombres ascendants de 0 à length-1 indépendamment du contenu du tableau. –

+1

Ok merci pour votre aide. Je viens de l'éditer. – redestructa

0

La réponse actuelle top n'a pas wo RK comme prévu pour moi parce que les valeurs clés sont décalées +1. . (Et donc le tableau retourné tmpArr (0) est également toujours undefined Je soustrait 1 de la valeur clé et cela a fonctionné comme prévu

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 
}