Ответ 1
Вы можете отсортировать массив и указать, что значение "role"
встречается перед всеми другими значениями и что все остальные значения равны:
var first = "role";
data.sort(function(x,y){ return x == first ? -1 : y == first ? 1 : 0; });
Я хочу проверить, содержит ли массив "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; });
Моя первая мысль:
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');
}
Литература:
Самое чистое решение в ES6, на мой взгляд:
let data = ["email","role","type","name"];
data = data.filter(item => item !== "role");
data.unshift("role");
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]
Если вы не хотите изменять существующий массив, вы можете использовать деструктуризацию ES6 с помощью метода фильтра, чтобы создать новую копию при сохранении порядка других элементов.
const data = ["email", "role", "type", "name"];
const newData = ['role', ...data.filter(item => item !== 'role')];
Вот неизменное решение, если это необходимо:
const newData = [
data.find(item => item === 'role'),
...data.filter(item => item !== 'role'),
],
in
- это свойства, а не элементы в массивах. См. Как проверить, содержит ли массив объект в JavaScript? для использования else..remove()
, которую вы используете, принимает индекс элемента.Аналогично ответу @Tandroid, но более общее решение:
const putItemsFirst = ({ findFunction, array }) => [
...array.filter(findFunction),
...array.filter(signer => !findFunction(signer)),
];
Можно использовать так
putItemsFirst({
array: ["email","role","type","name"],
findFunction: item => item === 'role',
})
Нечто похожее на это - то, что я в конечном итоге использовал,
Если у вас есть массив объектов, вы можете сместить стартовый индекс с помощью сплайсинга и толчка. 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);
var data= ["email","role","type","name"];
data.splice(data.indexOf("role"), 1);
data.unshift('role');
Чтобы проверить, существует ли элемент в массиве, вы должны использовать .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)
Вы можете взять дельту чека с требуемым значением наверху.
var data = ["email", "role", "type", "name"];
data.sort((a, b) => (b === 'role') - (a === 'role'));
console.log(data);
Использование 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>
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"];
if ("role" in data) data.splice(data.indexOf("role"),1); data.unshift("role");
data;