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"]

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

Ответ 1

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

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

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

Ответ 2

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

var data= ["email","role","type","name"];

// if it not there, or is already the first element (of index 0)
// then there 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');
}

Литература:

Ответ 3

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

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

Ответ 4

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]

Ответ 5

Если вы не хотите изменять существующий массив, вы можете использовать деструктуризацию ES6 с помощью метода фильтра, чтобы создать новую копию при сохранении порядка других элементов.

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

Ответ 6

Вот неизменное решение, если это необходимо:

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

Ответ 7

  • Оператор in - это свойства, а не элементы в массивах. См. Как проверить, содержит ли массив объект в JavaScript? для использования else.
  • Вам не хватает фигурных скобок вокруг двух (!) операторов в if-блоке
  • Я не уверен, что эта функция .remove(), которую вы используете, принимает индекс элемента.

Ответ 8

Аналогично ответу @Tandroid, но более общее решение:

const putItemsFirst = ({ findFunction, array }) => [
    ...array.filter(findFunction), 
    ...array.filter(signer => !findFunction(signer)),
]; 

Можно использовать так

putItemsFirst({ 
    array: ["email","role","type","name"], 
    findFunction: item => item === 'role',
})

Нечто похожее на это - то, что я в конечном итоге использовал,

Ответ 9

Если у вас есть массив объектов, вы можете сместить стартовый индекс с помощью сплайсинга и толчка. Splice заменяет исходный массив частью массива, начиная с нужного индекса, и возвращает часть, которую он удаляет (материал перед индексом), который вы нажимаете.

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

Ответ 10

var data= ["email","role","type","name"];

data.splice(data.indexOf("role"), 1);
data.unshift('role');

Ответ 11

Чтобы проверить, существует ли элемент в массиве, вы должны использовать .includes() вместо in (как уже отмечалось здесь, in для свойств в объектах).

Эта функция делает то, что вы ищете: (удаляет элемент из позиции, в которой он находится, и читает впереди)

   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)

Ответ 12

Вы можете взять дельту чека с требуемым значением наверху.

var data = ["email", "role", "type", "name"];

data.sort((a, b) => (b === 'role') - (a === 'role'));

console.log(data);

Ответ 13

Использование lodash _.sortBy. Если элемент role, он будет отсортирован первым, в противном случае - вторым. Это тоже хорошо работает, если нет role

var data = ["email", "role", "type", "name"];

var sorted = _.sortBy(data, function(item) {
  return item === 'role' ? 0 : 1;
});

console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Ответ 14

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() указывает индекс для начала удаления элементов, а второй аргумент указывает количество аргументов для удаления.

Ответ 15

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