Búsqueda de sitios web

JavaScript mover un elemento de un arreglo al frente


Quiero comprobar si un array contiene "role". Si lo contiene, quiero mover "role" al principio del array.

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

Aquí, obtuve el resultado:

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

¿Cómo puedo arreglar esto?

Respuesta #1

Puedes ordenar el arreglo y especificar que el valor "role" venga antes que todos los demás valores, y que todos los demás valores sean iguales:

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

Demostración: http://jsfiddle.net/Guffa/7ST24/

Respuesta #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]

Respuesta #3

La solución más limpia en ES6, en mi opinión:

let data = ["email","role","type","name"];
data = data.filter(item => item !== "role");
data.unshift("role");

Respuesta #4

Mi primer pensamiento sería:

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

Revisar y ordenar un poco:

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

Referencias:

  • Array.indexOf().
  • Array.prototype.splice().
  • Array.unshift().

Respuesta #5

Aquí hay una solución inmutable si es necesario :

      const newData = [
          data.find(item => item === 'role'),
          ...data.filter(item => item !== 'role'),
        ],

Respuesta #6

Si no quieres alterar el arreglo existente, puedes usar la desestructuración de ES6 con el método filter para crear una nueva copia mientras mantienes el orden de los otros elementos.

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

Respuesta #7

Si tienes un arreglo de objetos, podrías desplazar el índice de inicio con splice y push. Splice reemplaza el arreglo original con la parte del arreglo comenzando desde el índice deseado y devuelve la parte que elimina (lo que está antes del índice), la cual empujas.

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

Respuesta #8

Para comprobar si un elemento existe en un arreglo, debes usar .includes() en lugar de in (como ya se señaló aquí, in es para propiedades en objetos).

Esta función hace lo que estás buscando: (elimina el elemento de la posición en la que está y lee enfrente)

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

Artículos relacionados