修改数组而不发生突变

时间:2018-08-24 20:50:38

标签: javascript arrays

我正在尝试解决一个问题,该问题指出要删除(删除)数组中的最小数字,而最小元素左侧的元素顺序不会更改。我的代码是-:

function removeSmallest(numbers){
    var x =  Math.min.apply(null,numbers);
    var y = numbers.indexOf(x);
    numbers.splice(y,1);
    return numbers;
}

在说明中严格规定不要对原始数组/列表进行变异。但是我收到一条错误消息,指出您已经对原始array / list进行了变异。 如何清除错误?

6 个答案:

答案 0 :(得分:1)

首先使用slice创建数组的副本,然后进行拼接

function removeSmallest(numbers){
    var x =  Math.min.apply(null,numbers);
    var y = numbers.indexOf(x);
    return numbers.slice().splice(y,1);
}

答案 1 :(得分:1)

array.slice()[... array]将复制数组对象。

”一词本身就是。 我认为,要复制数组对象,解决方案是:

var array_copy = copy(array);

// copy function
function copy(object) {
    var output, value, key;
    output = Array.isArray(object) ? [] : {};
    for (key in object) {
        value = object[key];
        output[key] = (typeof value === "object") ? copy(value) : value;
    }
    return output;
}

答案 2 :(得分:0)

您可以创建数组的浅表副本以避免突变。

function removeSmallest(numbers){
    const newNumbers = [...numbers];

    var x =  Math.min.apply(null,newNumbers);
    var y = newNumbers.indexOf(x);
    newNumbers.splice(y,1);

    return newNumbers;
}

答案 3 :(得分:0)

收听不要在此处使用SPLICE。当新手和专家在不考虑后果的情况下互换使用拼接和切片时,他们会犯错误,这是众所周知的。

SPLICE 将使原始数组发生突变,而 SLICE 将在给定条件下浅复制原始数组并返回该数组的一部分。

此处Slice将创建一个新数组

const slicedArray = numbers.slice()
const result = slicedArray.splice(y,1);

并且您无需改变原始数组即可得到结果。

答案 4 :(得分:0)

让我们专注于如何避免变异(我希望您不要把“删除错误”指的是“抑制错误消息”之类的意思)

Array.prototype上有不同的方法,大多数方法不会使数组发生变异,但会返回新数组。比如说.map,.slice,.filter,.reduce

告诉真相只有几个突变(例如.splice)

因此,根据其他要求,您可能会说.map有用

 let newArray = oldArray.filter(el => el !== minimalElementValue);

或.map

 let newArray = oldArray.map(el => el === minimalElementValue? undefined: el);

可以肯定的是,它们并不相等,但是两者都不会使原始变量变异

答案 5 :(得分:0)

我不确定问题的确切背景是什么,但是目标可能是学习编写纯数据转换,而不是学习如何复制数组。如果是这种情况,则在丢弃数组的副本后使用splice可能不会将其剪切。

一种既不变异原始数组也不复制其副本的方法可能看起来像这样:确定数组最小元素的索引,然后将两个子列表的串联返回该点的左右: / p>

const minIndex = arr =>
  arr.reduce(
    (p, c, i) => (p === undefined ? i : c < arr[p] ? i : p),
    undefined
  );
const removeMin = arr => {
  const i = minIndex(arr);
  return minIndex === undefined
    ? arr
    : [...arr.slice(0, i), ...arr.slice(i + 1)];
};

console.log(removeMin([1, 5, 6, 0, 11]));