gpt4 book ai didi

javascript - 如何查看一个数组是否与另一个数组相同以及为什么尝试查看它们是否 === 将第一个数组更改为第二个数组?

转载 作者:行者123 更新时间:2023-12-01 02:28:00 25 4
gpt4 key购买 nike

这是我第一次尝试编写任何代码,所以如果我所做的没有意义,请让我休息一下,并请解释发生了什么。我从来没有上过课或任何东西,只是读了几本书,所以如果你能解释一下,我将不胜感激。我正在尝试做这个问题(说明如下);

Given a sequence of integers as an array, determine whether it is possible to obtain a strictly increasing sequence by removing no more than one element from the array

所以,这就是我所做的:

function almostIncreasingSequence (sequence) {
for(x=0; x < sequence.length; x++) {
var y = sequence[x];
sequence.splice[x,1];
if (sequence === sequence.sort(function (a, b) {return a > b})) {
return sequence
} else {
sequence.splice[x,0,"y"]
}
}
}

当我将 true 和 false 作为返回它们应该去的地方时,它没有返回我想要的内容,因此我用序列替换了 true 并删除了 false 以查看发生了什么。这正是我为了查看它返回的内容所做的,所以我知道从那里该去哪里。我不是在寻求答案。我很困惑为什么它会返回它所做的事情。为什么这总是返回排序和比较的序列(数字按从最小到最大的顺序)?这不应该是答案,除非它应该返回“true”。我期望的是,它会删除数组中的每个元素,一次一个,检查它是否按顺序排列,如果不按顺序放回去。我选择{返回序列}只是为了看看序列最终做了什么,并且只为了答案应该为真的序列而返回它。再次,我认为它会检查序列(现在缺少元素序列[x])是否等于从最多到最少排序的序列 (sequence ===equence.sort(function (a,b) {return a>b})),如果是则返回'true',如果不是则替换 array[x]。然后重新开始,但每次只是从最小到最大返回数组。为什么第四行不被隔离?它不只是查看它们是否彼此相等,而是服从命令并更改整个序列定义。就像我要写的那样:

function almostIncreasingSequence (sequence) {
for (x=0; x < sequence.length; x++) {
var y = 1;
var x = 3;
if(x === y + x) {
return x
} else {
return y
}
}
}

这不会返回y+x,它总是返回y,那么为什么第一个示例返回sequence.sort(function (a,b ){return a>b}) 每次?我意识到它对“序列”进行了排序,然后“序列”变成了sequence.sort(function (a,b){return a>b}),但为什么呢?它位于 if 语句内,应该查看它们是否为 ===,而不是使序列 = 到已排序和比较的序列。它不像在第二个示例中,x 变成了y+x。这是怎么回事?为什么说 if(sequence ===equence.sort(function (a,b){return a>b})) 实际上是 array.sort[compare function]当它只应该查看它们是否相等时的序列?

最佳答案

sort 方法返回与应用 sort 方法相同的数组对象,而不是(已排序)数组。数组本身已排序,因此原始顺序会丢失。这称为就地排序。因此,对于任何数组 xx.sort() === x始终为真,与它的排序方式无关。比较是在对象(数组)引用上进行的,并且该引用在排序过程中不会更改。

所以有两个问题同时发生:

  • sort 改变调用它的数组。如果您想获得数组的排序版本而不影响原始数组,那么您必须首先获取一个副本,例如使用slice:

    sequence.slice().sort((a, b) => a - b)

    现在sequence将不会被排序,但表达式将返回它的排序副本。如果您继续这样:

    const sortedSeq = sequence.slice().sort((a,b) => a - b);
    if (sequence === sortedSeq[i]) then // ...etc

    ...即使原始数组已经排序,条件永远不会为真。请参阅下一点:

  • arr1arr2是数组时,比较它们的内容并不像arr1 === arr2那么简单。这只会告诉您它们是否是同一个对象(数组)引用。如果是,那么它们的内容必然相等,但反之则不然:如果两个数组是不同的引用,则并不意味着它们的元素相同且顺序相同。为此,您必须比较元素本身,例如您可以使用 every 进行比较:

    const sortedSeq = sequence.slice().sort((a,b) => a - b);
    if (sequence.every( (a, i) => a === sortedSeq[i] ) then // ...etc

    就是你认为自己正在做的事情。

<小时/>

请注意,您正在处理的挑战之前已在 StackOverflow 上提出过。请参阅Determine whether array holds an almost increasing sequence

关于javascript - 如何查看一个数组是否与另一个数组相同以及为什么尝试查看它们是否 === 将第一个数组更改为第二个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com