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?
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; });
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:
La solution la plus propre dans ES6 à mon avis:
let data = ["email","role","type","name"];
data = data.filter(item => item !== "role");
data.unshift("role");
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]
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')];
Voici une solution immuable si nécessaire:
const newData = [
data.find(item => item === 'role'),
...data.filter(item => item !== 'role'),
],
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..remove()
que vous utilisez prend l'index d'un élément.var data= ["email","role","type","name"];
data.splice(data.indexOf("role"), 1);
data.unshift('role');
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);
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,
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)