我正在使用array
s 按顺序保存一些数据,并且我想添加一个用户可以反转列表的功能。我想不出任何可能的方法,所以如果有人知道如何,请帮忙。
36 回答
Javascript 有一个reverse()
可以在数组中调用的方法
var a = [3,5,7,8];
a.reverse(); // 8 7 5 3
不确定这是否是您所说的“无法使用的库”,我猜这与练习有关。如果是这种情况,您可以实现自己的版本.reverse()
function reverseArr(input) {
var ret = new Array;
for(var i = input.length-1; i >= 0; i--) {
ret.push(input[i]);
}
return ret;
}
var a = [3,5,7,8]
var b = reverseArr(a);
请注意,内置.reverse()
方法对原始数组进行操作,因此您无需重新分配a
。
Array.prototype.reverse()
是您完成这项工作所需的全部内容。请参阅兼容性表。
var myArray = [20, 40, 80, 100];
var revMyArr = [].concat(myArray).reverse();
console.log(revMyArr);
// [100, 80, 40, 20]
这是一种功能性的方法。
const array = [1,2,3,4,5,6,"taco"];
function reverse(array){
return array.map((item,idx) => array[array.length-1-idx])
}
20 字节
let reverse=a=>[...a].map(a.pop,a)
我见过的最短的反向方法是这个:
let reverse = a=>a.sort(a=>1)
reveresed = [...array].reverse()
**
不使用反向方法的最短反向数组方法:
**
var a = [0, 1, 4, 1, 3, 9, 3, 7, 8544, 4, 2, 1, 2, 3];
a.map(a.pop,[...a]);
// returns [3, 2, 1, 2, 4, 8544, 7, 3, 9, 3, 1, 4, 1, 0]
a.pop 方法取出最后一个元素并使用扩展运算符 () 预先放置
MDN 链接供参考:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop
const original = [1, 2, 3, 4];
const reversed = [...original].reverse(); // 4 3 2 1
简明扼要,保持原样不变。
我已经对解决方案进行了一些测试,这些解决方案不仅可以反转数组,还可以复制它。这是测试代码。该reverse2
方法是 Chrome 中最快的方法,但在 Firefox 中该reverse
方法是最快的。
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var reverse1 = function() {
var reversed = array.slice().reverse();
};
var reverse2 = function() {
var reversed = [];
for (var i = array.length - 1; i >= 0; i--) {
reversed.push(array[i]);
}
};
var reverse3 = function() {
var reversed = [];
array.forEach(function(v) {
reversed.unshift(v);
});
};
console.time('reverse1');
for (var x = 0; x < 1000000; x++) {
reverse1();
}
console.timeEnd('reverse1'); // Around 184ms on my computer in Chrome
console.time('reverse2');
for (var x = 0; x < 1000000; x++) {
reverse2();
}
console.timeEnd('reverse2'); // Around 78ms on my computer in Chrome
console.time('reverse3');
for (var x = 0; x < 1000000; x++) {
reverse3();
}
console.timeEnd('reverse3'); // Around 1114ms on my computer in Chrome
这是一个不需要临时数组的版本。
function inplaceReverse(arr) {
var i = 0;
while (i < arr.length - 1) {
arr.splice(i, 0, arr.pop());
i++;
}
return arr;
}
// Useage:
var arr = [1, 2, 3];
console.log(inplaceReverse(arr)); // [3, 2, 1]
> var arr = [1,2,3,4,5,6];
> arr.reverse();
[6, 5, 4, 3, 2, 1]
array.reverse()
上面将反转您的数组,但会修改原始数组。如果您不想修改原始数组,则可以这样做:
var arrayOne = [1,2,3,4,5];
var reverse = function(array){
var arrayOne = array
var array2 = [];
for (var i = arrayOne.length-1; i >= 0; i--){
array2.push(arrayOne[i])
}
return array2
}
reverse(arrayOne)
function reverseArray(arr) {
let reversed = [];
for (i = 0; i < arr.length; i++) {
reversed.push((arr[arr.length-1-i]))
}
return reversed;
}
你可以做
var yourArray = ["first", "second", "third", "...", "etc"]
var reverseArray = yourArray.slice().reverse()
console.log(reverseArray)
你会得到
["etc", "...", "third", "second", "first"]
使用 .pop() 方法和 while 循环。
var original = [1,2,3,4];
var reverse = [];
while(original.length){
reverse.push(original.pop());
}
输出:[4,3,2,1]
53 字节
function reverse(a){
for(i=0,j=a.length-1;i<j;)a[i]=a[j]+(a[j--]=a[i++],0)
}
.reverse
只是为了好玩,这里有一个比原生方法更快的替代实现。
使用函数式编程反转数组的纯函数:
var a = [3,5,7,8];
// ES2015
function immutableReverse(arr) {
return [ ...a ].reverse();
}
// ES5
function immutableReverse(arr) {
return a.concat().reverse()
}
正如其他人提到的,您可以.reverse()
在数组对象上使用。
但是,如果您关心保留原始对象,则可以reduce
改用:
const original = ['a', 'b', 'c'];
const reversed = original.reduce( (a, b) => [b].concat(a) );
// ^
// |
// +-- prepend b to previous accumulation
// original: ['a', 'b', 'c'];
// reversed: ['c', 'b', 'a'];
也可以使用map方法来实现。
[1, 2, 3].map((value, index, arr) => arr[arr.length - index - 1])); // [3, 2, 1]
或使用reduce(稍微长一点的方法)
[1, 2, 3].reduce((acc, curr, index, arr) => {
acc[arr.length - index - 1] = curr;
return acc;
}, []);
我不确定库是什么意思,但这是我能想到的最好方法:
// return a new array with .map()
const ReverseArray1 = (array) => {
let len = array.length - 1;
return array.map(() => array[len--]);
}
console.log(ReverseArray1([1,2,3,4,5])) //[5,4,3,2,1]
// initialize and return a new array
const ReverseArray2 = (array) => {
const newArray = [];
let len = array.length;
while (len--) {
newArray.push(array[len]);
}
return newArray;
}
console.log(ReverseArray2([1,2,3,4,5]))//[5,4,3,2,1]
// use swapping and return original array
const ReverseArray3 = (array) => {
let i = 0;
let j = array.length - 1;
while (i < j) {
const swap = array[i];
array[i++] = array[j];
array[j--] = swap;
}
return array;
}
console.log(ReverseArray3([1,2,3,4,5]))//[5,4,3,2,1]
// use .pop() and .length
const ReverseArray4 = (array) => {
const newArray = [];
while (array.length) {
newArray.push(array.pop());
}
return newArray;
}
console.log(ReverseArray4([1,2,3,4,5]))//[5,4,3,2,1]
使用变量交换(可变)反转到位
const myArr = ["a", "b", "c", "d"];
for (let i = 0; i < (myArr.length - 1) / 2; i++) {
const lastIndex = myArr.length - 1 - i;
[myArr[i], myArr[lastIndex]] = [myArr[lastIndex], myArr[i]]
}
使用 sort 方法进行反转
- 这是一种更简洁的方法。
const resultN = document.querySelector('.resultN');
const resultL = document.querySelector('.resultL');
const dataNum = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const dataLetters = ['a', 'b', 'c', 'd', 'e'];
const revBySort = (array) => array.sort((a, b) => a < b);
resultN.innerHTML = revBySort(dataNum);
resultL.innerHTML = revBySort(dataLetters);
<div class="resultN"></div>
<div class="resultL"></div>
使用 ES6 的 rest 运算符和箭头函数。
const reverse = ([x, ...s]) => x ? [...reverse(s), x] : [];
reverse([1,2,3,4,5]) //[5, 4, 3, 2, 1]
两种方式:
计数器循环
function reverseArray(a) { var rA = [] for (var i = a.length; i > 0; i--) { rA.push(a[i - 1]) } return rA; }
使用 .reverse()
function reverseArray(a) { return a.reverse() }
使用交换并返回原始数组。
const reverseString = (s) => {
let start = 0, end = s.length - 1;
while (start < end) {
[s[start], s[end]] = [s[end], s[start]]; // swap
start++, end--;
}
return s;
};
console.log(reverseString(["s", "t", "r", "e", "s", "s", "e", "d"]));
事实上,reverse()
在某些情况下可能不起作用,所以你必须先做一个做作,如下所示
let a = [1, 2, 3, 4];
console.log(a); // [1,2,3,4]
a = a.reverse();
console.log(a); // [4,3,2,1]
或使用concat
let a = [1, 2, 3, 4];
console.log(a, a.concat([]).reverse()); // [1,2,3,4], [4,3,2,1]
不使用 push() 怎么办!
使用异或的解决方案!
var myARray = [1,2,3,4,5,6,7,8];
function rver(x){
var l = x.length;
for(var i=0; i<Math.floor(l/2); i++){
var a = x[i];
var b = x[l-1-i];
a = a^b;
b = b^a;
a = a^b;
x[i] = a;
x[l-1-i] = b;
}
return x;
}
console.log(rver(myARray));
JavaScript 已经在 Array 上有 reverse() 方法,所以你不需要做那么多!
想象一下你有下面的数组:
var arr = [1, 2, 3, 4, 5];
现在只需这样做:
arr.reverse();
你得到这个结果:
[5, 4, 3, 2, 1];
但这基本上改变了原始数组,您可以编写一个函数并使用它来返回一个新数组,如下所示:
function reverse(arr) {
var i = arr.length, reversed = [];
while(i) {
i--;
reversed.push(arr[i]);
}
return reversed;
}
或者简单地改变 Array 的 JavaScript 内置方法,如下所示:
function reverse(arr) {
return arr.slice().reverse();
}
你可以这样称呼它:
reverse(arr); //return [5, 4, 3, 2, 1];
如前所述,主要区别在于第二种方式,您不要触摸原始数组...
这个怎么样?:
function reverse(arr) {
function doReverse(a, left, right) {
if (left >= right) {
return a;
}
const temp = a[left];
a[left] = a[right];
a[right] = temp;
left++;
right--;
return doReverse(a, left, right);
}
return doReverse(arr, 0, arr.length - 1);
}
console.log(reverse([1,2,3,4]));
此函数适用于索引之间可能存在间隙的数组。
function reverse( a ) {
var b = [], c = [] ;
a.forEach( function( v ) { b.push( v ) } ) ;
a.forEach( function( v, i ) { c[i] = b.pop() } ) ;
return c ;
}
var a= [] ; a[1] = 2 ; a[3] = 4 ; a[7] = 6 ; a[9] = 8 ;
a = reverse( a ) ;
var s = '' ;
a.forEach( function( v, i ) { s += 'a[' + i + '] = ' + v + ' ' } ) ;
console.log( s ) ;
// a[1] = 8 a[3] = 6 a[7] = 4 a[9] = 2
以下是具有最佳空间和时间复杂度的解决方案
function reverse(arr){
let i = 0;
let j = arr.length-1;
while(i<j){
arr[j] = arr[j]+arr[i];
arr[i] = arr[j] - arr[i];
arr[j] = arr[j] - arr[i];
i++;
j--;
}
return arr;
}
var arr = [1,2,3,4,5,6,7,8,9]
reverse(arr);
输出 => [9,8,7,6,5,4,3,2,1]
使用 ES6 反转数组和子数组(就地)。
function reverse(array, i=0, j=array.length-1){
while (i < j){
[array[i], array[j]] = [array[j], array[i]];
++i;
--j;
}
}
我们有 reverse() 函数来反转 JS 中的给定数组。
var a = [7,8,9];
a.reverse(); // 9 8 7
function reverseArr(input)
{
var ret = new Array;
for(var i = input.length-1; i >= 0; i--)
{
ret.push(input[i]);
}
return ret;
}
我也面临同样的问题。谢谢你的这个问题。我做了如下代码片段的代码。它工作得很好。我用的是 ES6。
const Array = ["a", "b", "c", "d"];
let revArray = [].concat(Array).reverse();
当我 console.log 它时,我得到如下输出
console.log(revArray)
// output: ["d","c","b","a"]
我只是将haskell实现重写为js。
const rev = (list, reversed) => {
if (list.length == 0) return reversed
reversed.unshift(list[0])
return rev(list.slice(1), reversed)
}
const reverse = (list) => rev(list, [])