为什么串联和排序方法的行为很奇怪? 2本质上相同的方式不会以相同的方式工作

时间:2019-05-19 06:16:40

标签: javascript arrays

我正在研究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。 为什么?我感到很困惑。它在功能之外起作用,但在功能上不起作用。

2 个答案:

答案 0 :(得分:1)

concat不会突变任何现有的数组(调用该函数的数组或参数列表中的一个或多个数组)。调用concat时,返回一个 new 数组。因此,独立声明

newArr.concat(arr);

不执行任何操作-您将newArrarr串联在一起,创建了一个新的组合数组,但是该组合数组未分配给任何东西;它先经过评估然后丢弃。

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);