Pesquisa de site

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);

Artigos relacionados