web-dev-qa-db-fra.com

JavaScript déplace un élément d'un tableau vers l'avant

Je veux vérifier si un tableau contient "role". Si tel est le cas, je souhaite déplacer le "role" au début du tableau.

var data= ["email","role","type","name"];
if ("role" in data) data.remove(data.indexOf("role")); data.unshift("role")
data;

Ici, j'ai eu le résultat:

["role", "email", "role", "type", "name"]

Comment puis-je réparer cela?

32
user2634156

Vous pouvez trier le tableau et spécifier que la valeur "role" vient avant toutes les autres valeurs et que toutes les autres valeurs sont égales:

var first = "role";
data.sort(function(x,y){ return x == first ? -1 : y == first ? 1 : 0; });

Démo: http://jsfiddle.net/Guffa/7ST24/

33
Guffa

Ma première pensée serait:

var data= ["email","role","type","name"];

// if it's not there, or is already the first element (of index 0)
// then there's no point going further:
if (data.indexOf('role') > 0) {
    // find the current index of 'role':
    var index = data.indexOf('role');
    // using splice to remove elements from the array, starting at
    // the identified index, and affecting 1 element(s):
    data.splice(index,1);
    // putting the 'role' string back in the array:
    data.unshift('role');
}

console.log(data);

Pour réviser et ranger un peu:

if (data.indexOf('role') > 0) {
    data.splice(data.indexOf('role'), 1);
    data.unshift('role');
}

Références:

34
David Thomas

La solution la plus propre dans ES6 à mon avis:

let data = ["email","role","type","name"];
data = data.filter(item => item !== "role");
data.unshift("role");
27
Skylar Brown
let data = [0, 1, 2, 3, 4, 5];
let index = 3;
data.unshift(data.splice(index, 1)[0]);
// data = [3, 0, 1, 2, 4, 5]
11
MiLeung

Si vous ne souhaitez pas modifier le tableau existant, vous pouvez utiliser la déstructuration ES6 avec la méthode de filtrage pour créer une nouvelle copie tout en conservant l'ordre des autres éléments.

const data = ["email", "role", "type", "name"];
const newData = ['role', ...data.filter(item => item !== 'role')];
6
Tandroid

Voici une solution immuable si nécessaire:

      const newData = [
          data.find(item => item === 'role'),
          ...data.filter(item => item !== 'role'),
        ],
4
Maldoror
  1. l'opérateur in concerne les propriétés, pas les éléments des tableaux. Voir Comment puis-je vérifier si un tableau inclut un objet en JavaScript? pour quoi utiliser autrement.
  2. Il vous manque des accolades autour des deux (!) Déclarations dans votre bloc if
  3. Je ne sais pas si la fonction .remove() que vous utilisez prend l'index d'un élément.
2
Bergi
var data= ["email","role","type","name"];

data.splice(data.indexOf("role"), 1);
data.unshift('role');
1
Dan Smolinske

Si vous avez un tableau d'objets, vous pouvez déplacer l'index de départ avec splice et Push. Splice remplace le tableau d'origine par la partie du tableau commençant par l'index souhaité et retourne la partie qu'il supprime (le contenu avant l'index) que vous poussez. 

let friends = [{
    id: 1,
    name: "Sam",
  },
  {
    id: 2,
    name: "Steven",
  },
  {
    id: 3,
    name: "Tom",
  },
  {
    id: 4,
    name: "Nora",
  },
  {
    id: 5,
    name: "Jessy",
  }
];

const tomsIndex = friends.findIndex(friend => friend.name == 'Tom');
friends.Push(...friends.splice(0, tomsIndex));

console.log(friends);

1
Tamo Maes

Similaire à la réponse de @ Tandroid mais avec une solution plus générale:

const putItemsFirst = ({ findFunction, array }) => [
    ...array.filter(findFunction), 
    ...array.filter(signer => !findFunction(signer)),
]; 

Peut être utilisé comme ça

putItemsFirst({ 
    array: ["email","role","type","name"], 
    findFunction: item => item === 'role',
})

Quelque chose de semblable à ceci est ce que j'ai fini par utiliser, 

1
Petter Sælen

Pour vérifier si un élément existe dans un tableau, vous devez utiliser .includes() au lieu de in (comme déjà noté ici, in est destiné aux propriétés d'objets).

Cette fonction fait ce que vous recherchez: (Supprime l’élément de la position dans laquelle il se trouve et le lit avant ).

   data = ["email","role","type","name"];
   moveToFirst("role", data)
    
   function moveToFirst(s, r){
      if (r.includes(s)){
        r.splice(r.indexOf(s),1);
        r.unshift(s);
      } 
    }
    
    console.log(data)

0
JPR