Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Самый простой способ поменять местами строковые элементы массива?

#javascript #массивы


Имеем массив:

var mass = ["elem1", "elem2", "elem3", "elem4" "elem5"];


Какой самый простой способ поменять местами 2 и 4 (к примеру элемент)?
Кроме переприсваивания через дополнительную переменную типа

temp1 = mass[2];
mass[2] = mass[4];
mass[4] = temp1;


Может быть в Js есть более элегантный способ? (ну как функция .SORT для сортировки)
Или это единственный способ?
    


Ответы

Ответ 1



В современном js такой способ есть, называется деструктуризирующее присваивание (destructuring assignment): [mass[1], mass[3]] = [mass[3], mass[1]]; То есть [a, b] = [b, a]; Вот только IE11 и Андроиды так не умеют из коробки, если хочется писать так чтобы работало везде - придется транспилировать. Еще есть везде-рабочий "ниндзя" способ, за который в приличном обществе бьют ногами за нечитаемость: mass[1] = [mass[3], mass[3] = mass[1]][0]; То есть: a = [b, b = a][0];

Ответ 2



вот ещё одна старая рабочая "нидзя" для коррекции массива var arr = [2,1,3,5,4,0] arr[1] = arr.splice(0,1, arr[1])[0] //console.log(arr) массивы можно корректировать через метод, для понимания снабдив код комментариями. function correctArr(_arr, _param){ /* коррекция элементов массива по паре индекса * _arr -- массив требующий коррекции * _param -- пара [n1,n2] -- индексы массива для взаимной перестановки */ _arr[_param[1]] = _arr.splice(_param[0],1, _arr[_param[1]])[0] } //correctArr(arr, [1,0]) //console.log(arr.toString()) можно написать метод c циклом с обращением к функции, и возвращением нового массива function corrects_Arr(){ var _param, _arr = arguments[0].slice(), _arguments = Array.prototype.slice.call(arguments, 1) for(var i = 0; i < _arguments.length; i++){ correctArr(_arr, _arguments[i]) } return _arr } /* console.log( arr.toString() +" "+ "инспектируемый массив остался прежним" +"\n"+ corrects_Arr(arr, [0,1], [4,3]).toString() +" "+ "вернули скорректированный массив" ) */ для простоты будущего обращения с массивами, можно утяжелить решение задачи, по пути присвоения прототипу конструктора Array своего метода, который можно будит вызывать на всех массивах. Array.prototype["myCorrects"] = function(_param){ if(_param){ this[_param[1]] = this.splice(_param[0],1, this[_param[1]])[0] this.constructor.prototype.myCorrects.apply(this, Array.prototype.slice.call(arguments, 1)) } return this } arr = arr.myCorrects([0,1], [3,4]).splice(-1,1).concat(arr) console.log(arr.toString())

Ответ 3



var arr = [1, 2, 3, 4, 5, 6, 7, 8]; for (var res = [], j = arr.length - 1; j >= 0; j -= 4) res.unshift (arr [j - 2]), res.unshift (arr [j - 3]), res.unshift (arr [j]), res.unshift (arr [j - 1]); alert (res);

Комментариев нет:

Отправить комментарий