J'ai 2 tableaux. J'essaye de retourner les valeurs similaires entre les 2 mais dans l'ordre de la seconde. Par exemple, jetez un œil aux deux tableaux:

array1 = ['a', 'b', 'c']
array2 = ['b', 'c', 'a', 'd']

Ce que je voudrais retourner, c'est ceci:

sim = ['b', 'c', 'a']

Voici un lien vers ce que j'essaie d'accomplir. Actuellement, le script est défectueux et n'attrape pas le cas du coin.

2
Skullomania 12 avril 2018 à 19:19

5 réponses

Meilleure réponse

Vous pouvez utiliser un Set pour array1, utilisez {{ X2}} array2 en vérifiant l'ensemble.

var array1 = ['a', 'b', 'c'],
    array2 = ['b', 'c', 'a', 'd'],
    theSet = new Set(array1),
    result = array2.filter(v => theSet.has(v));
    
console.log(result);

Quelques annotations à votre code:

function arr_sim (a1, a2) {
    var //a = {},                         // take an object as hash table, better
        a = Object.create(null),          // a really empty object without prototypes
        sim = [],
        i;                                // use single declaration at top

    for (i = 0; i < a1.length; i++) {     // iterate all item of array 1
        a[a1[i]] = true;
    }

    for (var i = 0; i < a2.length; i++) {
        if (a[a2[i]]) {
            sim.push(a2[i]);              // just push the value
        }
    }
    return sim;
}

console.log(arr_sim(['a', 'b', 'c'], ['b', 'c', 'a', 'd']));
8
Nina Scholz 12 avril 2018 à 16:35

Je pense que c'est ce que vous cherchez?

function arr_sim (a1, a2) {
a1 = Array.isArray(a1)?a1:typeof a1 == "string"?a1.split(""):false;
a2 = Array.isArray(a2)?a1:typeof a2 == "string"?a2.split(""):false;
if(!a1 || !a2){
alert("Not valid values");
return;
}

var filterArray = a1.filter(function(val){
return a2.indexOf(val) !== -1;
})

    return filterArray;
}

console.log(arr_sim(['a', 'b'], ['b', 'a', 'c', 'd']));
console.log(arr_sim("abcd", "abcde"));
console.log(arr_sim("cxz", "zcx"));
1
Nishant Dixit 12 avril 2018 à 16:32

Essayez cet exemple ici valeurs similaires entre en deux tableaux

var a1 = ['a' ,'b'];

var a2 = ['a' ,'b' ,'c'];

var result = arr_sim(a1,a2);// call method arr_sim

console.log(result);

function arr_sim (a1, a2) {

    var similar = [];

    for( var i = 0 ; i <a1.length ; i++ ){ // loop a1 array

        for( var j = 0 ; j <a2.length ; j++ ){ // loop a2 array

            if( a1[i] ==  a2[j] ){ // check if is similar

                similar.push(a1[i]); // add to similar array

                break; // break second loop find  that is similar

            } // end if

        } // end second lopp

    } // end first loop

    return similar; // return result

} // end function
0
Klodian shaba 12 avril 2018 à 17:05

Vous pouvez itérer array2 avec un filtre et vérifier si la valeur est contenue dans array1:

let array1 = ['a', 'b', 'c'];
let array2 = ['b', 'c', 'a', 'd'];

let sim = array2.filter((entry) => {
  return array1.includes(entry);
});

console.log(sim);
4
KevBot 12 avril 2018 à 16:22

Essaye ça

const arr_sim = (a1, a2) => a2.filter(a => a1.includes(a))

console.log(arr_sim(['a', 'b', 'c'], ['b', 'c', 'a', 'd']));
1
Lucas Alencar 12 avril 2018 à 16:33