对数组进行排序并将其与原始数据进行比较

时间:2017-09-18 12:25:36

标签: javascript arrays functional-programming

我在排序数组时试图完全理解函数式编程为什么原始数组也会变为排序数组?一世 想检查数组是否按升序排列。

let arr = [1,2,8,3,9,88,67];
let newArr = arr.sort((a,b) => a-b);
console.log(newArr);
console.log(arr);

我想做点像......

if (arr === newArr) {
return true;
} else {
return false;
}

原始的arr也正在排序,所以它总是如此, 一些指导将非常感谢。

6 个答案:

答案 0 :(得分:1)

这就是排序运算符的设计方式。它修改现有数组,而不是创建新数组。如果要创建新数组,可以这样做:

let arr = [1,2,8,3,9,88,67];
let newArr = arr.slice(); // creates a copy of the array
newArr.sort((a,b) => a-b);

console.log(newArr);
console.log(arr);

答案 1 :(得分:0)

Javascript数组是一个对象,当2个变量引用同一个对象时,更改一个会改变另一个的值

let obj1 = {x:1, y:2};

let obj2 = obj1;

obj2.x = 3;

console.log(obj1);

您可以使用

对其进行排序

let arr = [1,2,8,3,9,88,67];
let newArr = arr.slice().sort((a,b) => a-b);
console.log(newArr);
console.log(arr);

答案 2 :(得分:0)

通过指定一个对象,可以获取对象的引用,这意味着ecery更改会影响同一个对象。

对于数组,您可以使用Array#slice对其进行“浅拷贝”,然后映射项目的检查。

var array = [1, 2, 8, 3, 9, 88, 67],
    sorted = array.slice().sort((a, b) => a - b),
    position = array.map((a, i) => a === sorted[i]);

console.log(sorted);
console.log(position);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:0)

根据你的问题, 你只需要识别

  

如果数组按升序排列

要做到这一点,只需应用一些简单的逻辑,我们不希望将它与已排序的数组进行比较。

这是最快的方法,因为它会在错误的条件下打破循环。

let arr = [1,2,8,3,9,88,67];
let is_sorted = true;

for(let i=0, length = arr.length; i < length - 1; i++){
  if(Number(arr[i]) > Number(arr[i+1])){
    is_sorted = false;
    break;
  }
}

console.log("Is Sorted: ", is_sorted);

答案 4 :(得分:0)

这是XY problem - 也就是说,你希望&#34; ...检查数组是否按升序排列&#34; 并尝试排序(通过{{ 1}})然后您使用二元运算符Array.prototype.sort检查结果。结果不是您所期望的,因此您询问排序而不是将重点放在实际目标上:检查升序

您不应该排序的案例

想象一下数百或数千或物品的大量数组。以下数组是否按升序排列?

==

当然它isAscending ([ 5, 1, ... thousands more items ... ]) // => true or false ? 因为1小于5;数组按升序排列。我们是否必须对整个阵列进行排序才能得出答案?不,我们只需要查看前两项(在这种情况下)就知道答案是false

其他答案显示使用false 复制输入数组 - 这很愚蠢,因为我们当然不必复制数组以确定它是否在升序 - 它浪费时间/空间。

您不应该使用.slice 的原因

首先,你不能,因为以下(在JavaScript中)

==

那么如果可以的话 将如何使用[ 1, 2, 3 ] == [ 1, 2, 3 ] // => false ?也许一种方法是检查第一个数组中的每个元素是否等于第二个数组中的每个数组元素。好的,现在想象两个包含数十万件物品的大型阵列。以下两个数组是否相等?

==

我们知道他们并不相同,因为[ 1, ... thousands of items ... ] == [ 2, ... thousands of items ... ] // => true or false ? - 它与排序的情况相同;在比较其余项目时没有任何意义,因为我们已经知道数组不相等

JavaScript中有other ways to compare Arrays (and objects),但我们只有一个输入数组,所以没有数组可以将它与之比较 - 这是另一个死胡同方法

检查数组是否按升序排列

好的,现在已经完成了在JavaScript中讨论数组排序和数组相等性,我们实际上可以编写一个执行你想做的事情的函数

&#13;
&#13;
1 != 2
&#13;
&#13;
&#13;

堆栈安全递归

但是你必须be careful using recursion in JavaScript - 只有几千个元素的输入数组可能导致上面程序中的堆栈溢出

使用常量空间循环机制,我们可以以适用于任何输入大小的数组的方式重写const isAscending = ([x,y,...rest]) => x === undefined // array is empty ? true : y === undefined // single element array ? true : x > y // first element is larger than second ? false : isAscending ([y,...rest]) // check remaining elements console.log (isAscending ([])) // true console.log (isAscending ([1])) // true console.log (isAscending ([1,3,5,7])) // true console.log (isAscending ([5,1,3,7])) // falseisAscending / loop接口使我们有机会跟踪任何数量/类型的状态变量,因此该实现还避免了昂贵的多个数组切片的创建(在上面的rest参数和spread参数语法中)< / p>

&#13;
&#13;
recur
&#13;
&#13;
&#13;

*或const recur = (...args) => ({ type: recur, args }) const loop = f => { let acc = f () while (acc.type === recur) acc = f (...acc.args) return acc } const isAscending = xs => xs.length < 2 ? true : loop ((a = 0, b = 1) => a === xs.length ? true : xs [a] > xs [b] ? false : recur (a + 1, b + 1)) // * console.log (isAscending ([])) // true console.log (isAscending ([1])) // true console.log (isAscending ([1,3,5,7])) // true console.log (isAscending ([5,1,3,7])) // false,保存每个数组元素的加法运算

答案 5 :(得分:-1)

应用于数组的sort方法将修改数组本身。所以将第一个数组排序并且 arr newArr 都相等是合乎逻辑的。您可以在此处阅读有关该方法的更多信息:

https://www.w3schools.com/jsref/jsref_sort.asp

要测试数组是否按升序排列,您可以遍历它并检查是否存在并索引 i 其中 arr [i + 1]&lt; ARR [I]

let arr = [1,2,8,3,9,88,67];
let test=true;

for (var i = 1; i < arr.length; i++) {
    if(arr[i]<arr[i-1]) {
      test=false;
      break;
    }
    
}
console.log(test);