使用sort()方法比较两个数组

时间:2020-04-05 11:39:02

标签: javascript

我有下一个代码应该比较数组;

function compare(arr) {
    const sorted = arr.sort((a,b)=> a -b).join(',');
    const unsorted = arr.join(',')
    console.log(sorted === unsorted) // true
}

compare([1, 16, 7])

为什么我得到true,或者数组应该不同?

5 个答案:

答案 0 :(得分:2)

尝试使用扩展运算符复制阵列

请注意,数组是按顺序排序的,因此不会进行复制。

function compare(arr) {
  const sorted = [...arr].sort((a, b) => a - b).join(',');
  const unsorted = arr.join(',')
  console.log(sorted === unsorted) // true
}

compare([1, 16, 7])

答案 1 :(得分:0)

原因是您正在比较相同的字符串。 相同的字符串如何?好吧,.sort()进行了适当的排序-意味着它不会返回新的排序数组,而是对同一数组进行排序。因此,对于unsorted,您要加入相同的排序数组。 您可以尝试切换分配的顺序,结果应该不同

答案 2 :(得分:0)

根据MDN cat file1.txt | awk -v OFS="\t" '$1=$1' | tail -n +2 | awk '$1>=1 && $1<=4' 1 10 12 1 34 44 2 1 -3 3 4 -10.3 3 3.390 4 4 43 3 1 -90.3 2 2 32 3 3 43 -20 4 2 2 2 21 12 4 -0.9 12 4 -2.19 34 4 4 4 3 -12 3 ,将修改原始数组! MDN Array.prototype.sort()

答案 3 :(得分:0)

由于要对数组进行排序,因此几乎无法检查它们是否相等。 如果您不想检查所有存在的值是否都与两个数组相同,可以尝试这样的方法。

    function compare(arr) {
    const unsorted = arr.slice()
    const sorted = arr.sort((a,b)=> a -b)

    console.log(sorted)
    console.log(unsorted)

    if(checkIfValuesAreEqual(sorted, unsorted))
        console.log("they are equal")
    else
        console.log("they are not equal")
}

checkIfValuesAreEqual = (sorted, unsorted) => {
    if(sorted.length != unsorted.length)
        return false

    let sortedObj = {}
    let unsortedObj = {}

    for(const value of sorted){
        if(value in sortedObj)
            sortedObj[value] += 1
        else
            sortedObj[value] = 1
    }

    for(const value of unsorted){
        if(value in unsortedObj)
            unsortedObj[value] += 1
        else
            unsortedObj[value] = 1    
    }

    const keysSorted = Object.keys(sortedObj)
    const keysUnSorted = Object.keys(unsortedObj)


    if(keysSorted.length != keysUnSorted.length)
        return false


    for(const key of keysSorted){
        if(sortedObj[key] != unsortedObj[key])
            return false
    }

    return true

}

compare([1, 16, 7])

由于不得不更改诸如unsorted = arr.slice()之类的某些内容,因此Javascript通过引用来放置所有内容,因此未排序的n排序是相同的。要检查两者是否相同,我需要循环遍历,因此我需要将它们作为数组而不是字符串。

如果一个字符串被排序而另一个字符串不是因为某些值交换位置,则我不认为您可以比较两个字符串。

答案 4 :(得分:0)

Array#Sort进行适当排序。因此,在排序之前先加入数组:

function compare(arr) {
    const unsorted = arr.join(',');//moved up
    const sorted = arr.sort((a,b)=> a -b).join(',');
    console.log(sorted === unsorted) // false
}

compare([1, 16, 7])

相关问题