繁体   English   中英

修改数组而不改变

[英]Modify an array without mutation

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

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

说明中严格规定不要改变原始数组/列表。 但是我收到一条错误消息,指出您已更改原始数组/列表。 如何删除错误?

听这里不要使用 SPLICE。 菜鸟和专家经常犯的一个众所周知的错误是,他们在不考虑效果的情况下交替使用 splice 和 slice。

SPLICE将改变原始数组,而SLICE将浅拷贝原始数组并在给定条件下返回数组的一部分。

这里 Slice 会创建一个新的数组

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

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

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

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

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

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

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

    return newNumbers;
}

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

更新

替代解决方案是: -

var arr_copy = JSON.parse(JSON.stringify(arr));

让我们关注如何避免变异。 (我希望当你说“删除错误”时,你的意思不是“抑制错误消息”或类似的东西)

Array.prototype上有许多不同的方法,大多数方法不会改变数组,而是返回一个新的Array作为结果。 .map.slice.filter.reduce

说实话只有几个变异(比如.splice

因此,根据您的其他要求,您可能会发现.filter很有用

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

.map

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

当然,它们不相等但都不会改变原始变量

我不确定问题的确切上下文是什么,但目标可能是学习编写纯数据转换,而不是学习如何复制数组。 如果是这种情况,在制作阵列的一次性副本后使用splice可能无法切割它。

既不改变原始数组也不改变其副本的方法可能如下所示:确定数组的最小元素的索引,然后返回该点左右两个子列表的串联:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM