J'ai un éventail d'éléments où les entrées sont clairsemées. Comment puis-je facilement condenser le tableau rares dans un tableau dense afin que je n'ai pas à contrôler les valeurs nulles et indéfinies à chaque fois que je passe à travers les données?
Voici quelques données: P>
var sparse = []; sparse[1] = undefined; sparse[5] = 3; sparse[10] = null; var dense = sparseToDenseArray(sparse); // dense should be [3]
6 Réponses :
Vous pouvez utiliser Selon David Flanagan, dans JavaScript: le guide définitif em>, un moyen facile de transformer un tableau de race en une matrice dense consiste à utiliser un filtre sur celui-ci comme suit: P> filtre () code> compatible avec Firefox, Chrome, IE 9, Opera et Safari Web navigateurs Web.
var compacted = [];
for(var i = 0; i < sparse.length; i++)
if(sparse[i] != null)
compacted.push(sparse[i]);
Non, ces deux derniers extraits de code ne sont pas équivalents. Le dans code> vérifie si une propriété existe alors que les opérateurs d'égalité (
== code>,
! = Code>,
=== code>,
! == code>) ne peut rien vous dire à ce sujet.
Votre deuxième code de code ne fera pas ce que l'OP est après, en fait: il vous donnera [non défini, 3, null] code> pour la matrice dans la question.
@Timdown, je pense que vous vous référez à la première extrait de code de Charmander.
@Timdown: Je semble avoir libellé que l'ambiguïté et que je m'excuse. Par "ce qui précède" je voulais dire le filtre d'origine () code> exemple. Je vais le corriger immédiatement.
@IVAN: la deuxième dernière fois que. Dépend si vous comptez la doublure à l'aide du filtre code>.
@Timdown: En ce qui concerne la deuxième extrait de code renvoyant une valeur incorrecte - elle ne le fait pas. L'utilisation de ! = Code> par opposition à
! == code> assure que
non défini code> n'est pas inclus.
@Charander l'extrait de code avec si (i in cessé) code> retourne
[non défini, 3, null] code>.
@Charander: Oui, je signifiais spécifiquement celui utilisant l'opérateur dans code>.
@Timdown: Oui, c'est pourquoi j'ai fourni l'alternative - je ne suis pas tout à fait d'accord pour dire que le compactage d'une matrice rares signifie également supprimer tout indéfini code> et
null code> null code> de.
... Mais @ivan, vous êtes libre de prendre cet exemple si vous n'êtes pas d'accord avec ce désaccord.
Si vous souhaitez inclure Underscore.js dans votre code, vous pouvez utiliser le Fonction compact sur votre tableau . P>
à Vanilla JS, fonctionne sur tous les navigateurs:
function filt(a) { var b = []; for(var i = 0;i < a.length;i++) { if (a[i] !== undefined && a[i] !== null) { b.push(a[i]); } } return b; } > filt([1,undefined,3]) [1, 3]
(A [I]! == non défini) est redondant comme (a [i]! = null) comprend les deux cas (null et indéfini)
A [I]! = NULL correspond également à toutes les autres choses FALSY et je pense que cela doit être corrigé! ==, pas enlevé.
a [i]! = null code> est pas i> "correspond à toutes les autres choses FALSY". C'est Essayez IFF
A [i] code> est
non défini code> ou
null code>. Dans ce cas
si (a [i]! == indéfini && a [i]! == null) code> est strictement équivalent à
si (a [i]! = Null) code >, et pourrait être simplifié.
Filtre est une extension JavaScript à la norme ECMA-262; comme tel il peut ne pas être présent dans d'autres implémentations de la norme. Tu peux contourner cela en insérant le code suivant au début de vos scripts, permettant une utilisation du filtre dans les implémentations ECMA-262 qui ne le supporte pas de façon native. Référence: MDN strong> . p>
une solution de navigateur croisée utilisant
Filtre code> p>
xxx pré> démo. strong> p> blockquote>
Je ne peux pas croire qu'il y a des réponses si limitées ici. Tout d'abord, je pense qu'il y a de meilleures solutions plus rapides pour condenser un tableau de race. Je suppose qu'un matrice rare ne signifie pas un tableau avec des trous d'éléments indéfinis ( Qu'est-ce qui est un tableau dense? ). Un tableau de race devrait être un tableau où il n'ya en réalité aucune touche n'existe autre que les clés qui appartiennent aux valeurs existantes mais clairsemées. Donc, si nous ithétons sur les clés, nous devrions faire notre travail plus efficacement et plus rapide.
OK, j'ai compilé un test ci-dessous pour vous montrer la performance de plusieurs méthodes pour condenser un tableau de race. P>
p>
var ts = 0, te = 0, sparse = new Array(10000000), dense = []; [sparse[2499999], sparse[4999999], sparse[9999999]] = ["first one", "middle one", "last one"]; ts = performance.now(); dense = Object.keys(sparse).map(k => sparse[k]); te = performance.now(); console.log(dense, "Okeys and map resulted in :" +(te-ts)+ "msecs"); dense = []; ts = performance.now(); for (var key in sparse) dense.push(sparse[key]); te = performance.now(); console.log(dense, "for in loop resulted in :" +(te-ts)+ "msecs"); dense = []; ts = performance.now(); dense = sparse.filter(function (x) { return x !== undefined && x !== null; }); te = performance.now(); console.log(dense, "Array filter resulted in :" +(te-ts)+ "msecs"); dense = []; ts = performance.now(); for (var i = 0, len = sparse.length; i < len; i++) sparse[i] !== undefined && sparse[i] !== null && dense.push(sparse[i]); te = performance.now(); console.log(dense, "For loop resulted in :" +(te-ts)+ "msecs");
dans es2017 (ES8) Ceci est aussi simple que par exemple: p> p> objet.values (Sparsarray) code>
const sparseArray = [, , 'foo', 'bar', , 'baz', ,];
const compactArray = Object.values(sparseArray);
console.log(compactArray);
Pourquoi être dense être
[3] code> au lieu de
[non défini, 3, null] code>?
1 dans SPARSE === true code> mais
0 dans Sparse === false code>, que seuls ceux où vous n'avez pas défini de valeurs ne manquent pas vraiment. Si vous voulez faire cela, la réponse est
var dense = []; Sparse.Foreach (fonction (e) {dense.push (e)}) code>, comme cela ne boucle que sur les éléments existants