2011-09-24 2 views
1

Voici ce que j'ai actuellement:Comment filtrer un tableau Javascript et maintenir ses index?

var myArray = []; 
myArray[15] = 2; 
myArray[6323] = 1; 
myArray[349022] = 3; 
myArray = myArray.filter(function(i,v,a){return ! (typeof v == 'undefined')}); 
myArray = myArray.sort(function(a,b){return (a - b)}); 

Quand je console.log() allocationOrder après la fonction « filtre », je reçois les valeurs que je pense, mais les indices ne sont pas conservées. Comment puis-je maintenir les indices mais également supprimer les valeurs non définies (en raison de l'étalement des indices)? Gardez à l'esprit que j'ai besoin de trier le tableau par valeur après (c'est pourquoi j'ai évité les objets comme solution).

+0

Mais les valeurs comprises entre '15' et' 6323' 'undefined' ne sont-elles pas? Et que voulez-vous dire par «supprimer» dans ce contexte? – Blender

Répondre

2

Vous ne pouvez pas avoir votre gâteau et le manger aussi.

Vous ne pouvez pas avoir un tableau clairsemé (seules certaines valeurs sont remplies) et n'ont pas de valeurs indéfinies entre les deux. Ce n'est pas comme ça que fonctionnent les tableaux javascript. En outre, vous pouvez supprimer les éléments qui ont des valeurs indéfinies et attendre que les autres valeurs restent au même index. Par définition, en supprimant ces autres valeurs, réduit le tableau (en changeant les index). Peut-être que si vous pouvez décrire ce que vous essayez vraiment d'accomplir, nous pouvons trouver une meilleure façon d'aborder le problème.

Je pense que ce que vous voulez est un tableau d'objets où chaque objet du tableau a un index et une valeur. Les index sur les objets dans le tableau ne changeront jamais, mais le tableau conteneur peut être trié par ces index.

var mySortedArray = [ 
    {index:15, value: 2}, 
    {index:6323, value: 1}, 
    {index:349022, value: 3} 
]; 

mySortedArray = myArray.sort(function(a, b) {a.value - b.value}); 

Maintenant vous avez un tableau trié qui est trois éléments long et c'est réglé par la valeur et l'indice d'origine est conservée et disponible.

Le seul inconvénient est que vous ne pouvez pas y accéder facilement par l'index. Si vous vouliez avoir à la fois un accès ordonné et trié et un accès par la clé d'index, vous pouvez créer une structure de données parallèle qui permette un accès rapide aux clés. En Javascript, il n'y a pas de structure de données unique qui supporte à la fois l'accès par clé et l'accès par ordre trié.

Si vous voulez construire une structure de données en parallèle qui soutiendrait l'accès rapide par clé (et inclurait la valeur et la valeur sortOrder, vous pourriez construire un tel objet comme celui-ci:

// build a parallel data structure for keyed access 
var myKeyedObject = {}, temp, item; 
for (var i = 0; i < mySortedArray.length; i++) { 
    item = mySortedArray[i]; 
    temp = {}; 
    temp.value = item.value; 
    temp.index = item.index; 
    temp.sortOrder = i; 
    myKeyedObject[item.index] = temp; 
} 
+0

Les tableaux associatifs de PHP m'ont un peu gâté. Votre solution de création d'un tableau d'objets est aussi élégante que possible sans avoir à faire tout le nettoyage, et cela me donne la possibilité de trier les propriétés de l'objet, ce qui est exactement ce dont j'ai besoin. Je vous remercie. – Travis

+0

Bien que je ne regrette pas de vous répondre à l'intention réelle du demandeur, je noterai que, comme une réponse à la question dans le titre, cette réponse est fausse. – Brilliand

0

Alors que les tableaux JavaScript . se comportent plutôt bien si vous delete leurs entrées, il n'y a malheureusement pas de fonction intégrée qui fait cela cependant, il est trop difficile d'écrire un:

Avec
Array.prototype.filterAssoc = function(callback) { 
    var a = this.slice(); 
    a.map(function(v, k, a) { 
     if(!callback(v, k, a)) delete a[k]; 
    }); 
    return a; 
}; 

ce ajouté au prototype de tableau, myArray.filterAssoc(...).map(...) sera carte ov Seules les paires clé-valeur qui ont été filtrées ont été définies, comme prévu.

Cela répond à la question dans le titre. En ce qui concerne votre note de côté à propos de vouloir trier le tableau après ... sort ne se comporte pas bien sur les tableaux clairsemés. La façon la plus simple de le faire est de trier un tableau d'objets.

Questions connexes