JavaScript move um item de um array para o início
Eu quero verificar se um array contém "role". Se contiver, eu quero mover o "role" para o início do array.
var data= ["email","role","type","name"];
if ("role" in data) data.remove(data.indexOf("role")); data.unshift("role")
data;
Aqui, eu consegui o resultado:
["role", "email", "role", "type", "name"]Como posso consertar isso?
Resposta #1
Você pode ordenar o array e especificar que o valor "role" vem antes de todos os outros valores, e que todos os outros valores são iguais:
var first = "role";
data.sort(function(x,y){ return x == first ? -1 : y == first ? 1 : 0; });
Demonstração: http://jsfiddle.net/Guffa/7ST24/
Resposta #2
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]
Resposta #3
A solução mais limpa em ES6, na minha opinião:
let data = ["email","role","type","name"];
data = data.filter(item => item !== "role");
data.unshift("role");
Resposta #4
Meu primeiro pensamento seria:
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);
Para revisar e arrumar um pouco:
if (data.indexOf('role') > 0) {
data.splice(data.indexOf('role'), 1);
data.unshift('role');
}
Referências:
Array.indexOf().Array.prototype.splice().Array.unshift().
Resposta #5
Aqui está uma solução imutável, se necessário:
const newData = [
data.find(item => item === 'role'),
...data.filter(item => item !== 'role'),
],
Resposta #6
Se você não quiser alterar o array existente, pode usar a desestruturação do ES6 junto com o método filter para criar uma nova cópia enquanto mantém a ordem dos outros itens.
const data = ["email", "role", "type", "name"];
const newData = ['role', ...data.filter(item => item !== 'role')];
Resposta #7
Se você tiver um array de objetos, você poderia deslocar o índice inicial com splice e push. Splice substitui o array original pela parte do array a partir do índice desejado e retorna a parte que remove (as coisas antes do índice), que você empurra.
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);Resposta #8
Para verificar se um item existe em um array, você deve usar .includes() em vez de in (como já foi observado aqui, in é para propriedades em objetos).
Esta função faz o que você está procurando: (remove o item da posição em que está e lê à frente)
data = ["email","role","type","name"];
moveToFirst("role", data);
function moveToFirst( stringToMove, arrayIn ){
if ( arrayIn.includes(stringToMove) ){
let currentIndex = arrayIn.indexOf(stringToMove);
arrayIn.splice(currentIndex, 1);
arrayIn.unshift(stringToMove);
}
}
console.log(data);