[英]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.