我正在尝试解决一个问题,该问题指出要删除(删除)数组中的最小数字,而最小元素左侧的元素顺序不会更改。我的代码是-:
function removeSmallest(numbers){
var x = Math.min.apply(null,numbers);
var y = numbers.indexOf(x);
numbers.splice(y,1);
return numbers;
}
在说明中严格规定不要对原始数组/列表进行变异。但是我收到一条错误消息,指出您已经对原始array / list进行了变异。 如何清除错误?
答案 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]));