我正在研究FCC挑战,学习JS。这是使我感到困惑的link挑战。
我有点解决了,但是一个代码应该工作,而其他代码则不行,我认为它们本质上是相同的。
这是有效的代码:
var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
// Add your code below this line
return [].concat(arr).sort(function(a, b) {
return a - b;
});
// Add your code above this line
}
nonMutatingSort(globalArray);
此代码不起作用
var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
// Add your code below this line
let newArr = [];
newArr.concat(arr);
return newArr.sort(function(a,b){return a-b;});
// Add your code above this line
}
nonMutatingSort(globalArray);
我的问题本质上是为什么? 两种代码都将旧数组连接到新数组,并且两个函数都应返回排序后的数组。
但是在第一个函数中串联失败...它仅返回空arr。 为什么?我感到很困惑。它在功能之外起作用,但在功能上不起作用。
答案 0 :(得分:1)
concat
不会突变任何现有的数组(调用该函数的数组或参数列表中的一个或多个数组)。调用concat
时,返回一个 new 数组。因此,独立声明
newArr.concat(arr);
不执行任何操作-您将newArr
与arr
串联在一起,创建了一个新的组合数组,但是该组合数组未分配给任何东西;它先经过评估然后丢弃。
const arr1 = ['a'];
const arr2 = ['b'];
// Does not do anything by itself:
arr1.concat(arr2);
console.log(arr1);
console.log(arr2);
将结果分配给newArr
:
newArr = newArr.concat(arr);
var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
// Add your code below this line
let newArr = [];
newArr = newArr.concat(arr);
return newArr.sort(function(a,b){return a-b;});
// Add your code above this line
}
console.log(nonMutatingSort(globalArray));
// Original array is not mutated:
console.log(globalArray);
或者,完全避免使用newArr
的初始声明,而使用原始代码(我希望使用此代码)。实际上,更简洁地说,您可能只是slice
原始数组,而不是显式创建一个空数组:
var globalArray = [5, 6, 3, 2, 9];
const nonMutatingSort = arr => arr.slice().sort((a, b) => a - b);
console.log(nonMutatingSort(globalArray));
答案 1 :(得分:1)
concat方法返回一个新数组,因此您需要保存在同一变量或另一个变量中。就您而言:
var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
// Add your code below this line
let newArr = [];
newArr = newArr.concat(arr); //here it will return new new which you need to save
return newArr.sort(function(a,b){return a-b;});
// Add your code above this line
}
nonMutatingSort(globalArray);