JavaScript перемещает элемент массива на передний план

Я хочу проверить, содержит ли массив "role" . Если это так, я хочу переместить "role" в начало массива.

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

Здесь я получил результат:

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

Как я могу это исправить?

Вы можете отсортировать массив и указать, что значение "role" встречается перед всеми другими значениями и что все остальные значения равны:

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

Демо: http://jsfiddle.net/Guffa/7ST24/

Моя первая мысль:

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

Чтобы немного пересмотреть и привести в порядок:

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

Рекомендации:

  • Array.indexOf() .
  • Array.prototype.splice() .
  • Array.unshift() .
  1. Оператор in – это свойства, а не элементы в массивах. См. Как проверить, включает ли массив объект в JavaScript? Для чего использовать еще.
  2. Вам не хватает фигурных скобок вокруг двух (!) Операторов в if-блоке
  3. Я не уверен, что .remove() функция .remove() которую вы используете, принимает индекс элемента.

Самое чистое решение в ES6, на мой взгляд:

 let data = ["email","role","type","name"]; data = data.filter(item => item !== "role"); data.unshift("role"); 
 var i = -1; while (i < data.length) { if (data[i] === "role") { data.splice(i, 1); break; } i++; } data.unshift("role"); 

indexOf имеет ограниченную поддержку браузера, не будучи распознанной IE7-8. Поэтому я бы не использовал его, если бы был вами, даже за счет краткости кода на несколько строк. Вы также хотите поставить точку с запятой в конце инструкции «unshift». Первый аргумент splice () указывает индекс для начала удаления элементов, а второй аргумент указывает количество аргументов для удаления.

 var data= ["email","role","type","name"]; data.splice(data.indexOf("role"), 1); data.unshift('role'); 
 var data= ["email","role","type","name"]; if ("role" in data) data.splice(data.indexOf("role"),1); data.unshift("role"); data; 
Interesting Posts
Давайте будем гением компьютера.