5
votes

Comment puis-je obtenir l'index de la liste triée où l'élément change?

J'ai le tableau suivant et je cherche à récupérer l'index du tableau d'origine (trié) où l'élément change et à quelle fréquence cet élément individuel existe.

ac = [0,3,5,10]
ad = [3,2,5,2]

Le résultat souhaité devrait être comme ceci:

ab = [1,1,1,3,3,5,5,5,5,5,6,6]

Merci beaucoup pour toute suggestion.

Bravo.


3 commentaires

Comment? Pouvez-vous expliquer le modèle?


Pourquoi 0 dans ac ? Serait-ce alors le cas pour chaque tableau avec au moins une valeur?


Le premier élément de ac sera toujours 0, car à l'index 0 (premier élément du tableau) une nouvelle valeur apparaît. Il existe 3 fois dans le tableau, la première valeur de ad est donc définie sur 3.


4 Réponses :


5
votes

Vous pouvez parcourir le tableau et vérifier le prédécesseur. Si égal, incrémentez le dernier décompte, sinon ajoutez l'index et un décompte de un.

var array = [1, 1, 1, 3, 3, 5, 5, 5, 5, 5, 6, 6],
    { indices, counts } = array.reduce((r, v, i, a) => {
        if (a[i - 1] === v) {
            r.counts[r.counts.length - 1]++;
        } else {
            r.indices.push(i);
            r.counts.push(1);
        }
        return r;
    }, { indices: [], counts: [] });

console.log(...indices);
console.log(...counts);


0 commentaires

2
votes

Ce code produit une sortie similaire à celle que vous avez publiée:

var ab = [1,1,1,3,3,5,5,5,5,5,6,6];

var ac = Array.from(new Set(ab.map((e) => ab.indexOf(e))));

var ad = [];

for (var i = 0; i < ac.length - 1; i++) {
  ad.push(ac[i + 1] - ac[i]);
}
ad.push(ab.length - ac[ac.length - 1]);

console.log(...ab);
console.log(...ac);
console.log(...ad);


0 commentaires

1
votes

Essayez ceci, vous devriez obtenir ce que vous voulez

        ab = [1,1,1,3,3,5,5,5,5,5,6,6];

        var items = [];
        var positions = [];
        var count = [];

        ab.map((item, index)=>{

            //check if exist
            let item_index = items.indexOf(item);
            if(item_index == -1) {
                items.push(item);
                positions.push(index);
                count.push(1);
            } else {
                let current_count = count[item_index];
                count[item_index] = ++current_count;
            }
        });

        console.log(positions);
        console.log(count);


0 commentaires

1
votes

donc, en utilisant https://underscorejs.org/#groupBy , vous pouvez regrouper par valeur

{1: [1,1,1], 3: [3,3], 5: [5,5,5,5,5], 6: [6,6]}

vous obtiendrez un objet comme

_.groupBy([1,1,1,3,3,5,5,5,5,5,6,6]);

or 

_.groupBy([1,1,1,3,3,5,5,5,5,5,6,6], function(num){ return num; })

donc si vous prenez tout https://underscorejs.org/#keys et parcourir, la valeur sous la clé est array, prendre la taille et l'ajouter au nouveau tableau, donc vous pouvez faire ad = [3,2 , 5,2]

encore une fois, parcourez les clés et obtenez https://underscorejs.org/ #indexOf , vous pouvez construire ac = [0,3,5,10]

jouer avec ces méthodes, vérifier des exemples, et vous pouvez le faire vous-même!

p >


0 commentaires