Array.prototype.reverse 可以在原地(通过变异)反转数组的内容...
是否有一种类似简单的策略可以在不改变原始数组内容的情况下反转数组(无变异)?
Array.prototype.reverse 可以在原地(通过变异)反转数组的内容...
是否有一种类似简单的策略可以在不改变原始数组内容的情况下反转数组(无变异)?
Array#slice
的作用,这并不令人困惑。扩展语法没有任何更容易理解的理由。 - Unmitigated在ES6中:
const newArray = [...array].reverse()
.slice
更快。 - James Coyleslice
可能更快,因为 [...]
是一种通用的可迭代转数组方法,所以不能做出太多的假设。此外,由于 slice
已经存在很长时间了,它可能更好地优化过。” - Brian M. Huntconst originalArray = ['a', 'b', 'c', 'd', 'e', 'f'];
const newArray = Array.from(originalArray).reverse();
console.log(newArray);
slice()
创建一个重复的数组并不明显。 - icc97originalArray
创建一个新的数组,然后将其反转”。 - icc97另一种ES6变体:
我们还可以使用.reduceRight()
创建一个反转数组,而不实际反转它。
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
有用的资源:
reduceRight
非常慢。 - Dragos Rizescu(a,c)=> a.concat([c])
这种写法比 (a,c) => (a.push(c),a)
更符合惯用语言的表达方式。 - Kyle Linc
是一个数组,那么结果行为将与OP预期的不同。 - Kyle Lin尝试这个递归解决方案:
const reverse = ([head, ...tail]) =>
tail.length === 0
? [head] // Base case -- cannot reverse a single element.
: [...reverse(tail), head] // Recursive case
reverse([1]); // [1]
reverse([1,2,3]); // [3,2,1]
reverse('hello').join(''); // 'olleh' -- Strings too!
var array = [1,2,3,4,5,6,7,8,9,10];
// Using slice
var reverseArray1 = array.slice().reverse(); // Fastest
// Using spread operator
var reverseArray2 = [...array].reverse();
// Using for loop
var reverseArray3 = [];
for(var i = array.length-1; i>=0; i--) {
reverseArray.push(array[i]);
}
array.splice()
和 slice()
方法之间有性能差异吗? - S.Serpooshanslice()
而不是 splice()
。后者会返回一个空数组。 - rooch84使用.reduce()
和展开操作符的ES6替代方法。
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
或者使用前面提到的.reduceRight()
,但不带.push()
变异。
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
toReversed()
方法将调用数组对象的元素以相反的顺序进行转置,并返回一个新的数组。
const items = [1, 2, 3];
console.log(items); // [1, 2, 3]
const reversedItems = items.toReversed();
console.log(reversedItems); // [3, 2, 1]
console.log(items); // [1, 2, 3]
浏览器兼容性
const arrayCopy = Object.assign([], array).reverse()