我是typescript
的新手。我很抱歉提出这样的基本问题。但是我无法在我的代码中找出问题所在。我已经阅读了许多有关slice
和splice
的文章。我想在我的有角度的项目中使用它们(而不是两个都一起使用)。我得到了意外的输出。这是我的代码:
使用切片时:
newArray:string[];
mutatedArray:string[];
removeOneFruit() {
this.newArray=['Apple', 'Orange', 'Plums', 'Grapes'];
console.log("Before slicing: "+this.newArray);
this.mutatedArray=this.newArray.slice(this.newArray.indexOf('Orange'),1);
console.log("After slicing: "+this.mutatedArray);
}
输出:
切片前:苹果,橙子,李子,葡萄
切片后:
切片后的内容完全空白。控制台上没有错误或警告。这对我来说很奇怪。
使用接头时:
newArray:string[];
mutatedArray:string[];
removeOneFruit() {
this.newArray=['Apple', 'Orange', 'Plums', 'Grapes'];
console.log("Before splicing: "+this.newArray);
this.mutatedArray=this.newArray.splice(this.newArray.indexOf('Orange'),1);
console.log("After splicing: "+this.mutatedArray);
}
输出:
切片前:苹果,橙子,李子,葡萄
切片后:橙色
我不明白发生了什么。我期望的是除Orange
以外的所有结果的数组。请纠正我。
PS:它是一个大型项目的微型模型,其中的结果不是成果,而且也不会进行硬编码。
答案 0 :(得分:2)
.splice()
返回已删除的元素,但是如果在单独的行中使用它:
var arr = ['Apple', 'Orange', 'Plums', 'Grapes'];
arr.splice(arr.indexOf('Orange'), 1);
console.log(arr);
或者您可以像这样使用.slice()
:(有点长)
var arr = ['Apple', 'Orange', 'Plums', 'Grapes'];
//This slices from the start up to "Orange", then concatenates from after "Orange" to the end of the array
console.log(arr.slice(0, arr.indexOf('Orange')).concat(arr.slice( arr.indexOf('Orange') + 1, arr.length)));
答案 1 :(得分:1)
所以slice与拼接的功能不同
Array.slice 具有两个参数, start 和 end 。因此,在您的第一个函数中,您将给出Orange的开始索引和1的结束索引,我认为这是没有意义的,因为切片获取的项目在一个范围内,因此该范围内没有任何项目。
因此,如果您查看代码片段,那么我有Orange的索引,然后有一个向上的索引,因为切片是包含在内的,因此在您的示例中,Orange位于1索引,然后您将1作为结束索引。因此,我将索引1和索引2之间的所有内容都拉到了橙色。
let newArray;
let mutatedArray;
function removeOneFruit() {
newArray=['Apple', 'Orange', 'Plums', 'Grapes'];
console.log("Before slicing: "+newArray);
mutatedArray=newArray.slice(newArray.indexOf('Orange'), newArray.indexOf('Orange')+1);
console.log("After slicing: "+mutatedArray);
}
removeOneFruit()
您正在使用的第二项功能 splice (用于接合)从数组中删除项目。 Array.splice 获取一个索引和您要在该索引处删除的项目量。因此,您要做的就是使用要删除的项目创建一个新数组。如果要返回一个数组,除了Orange以外的所有内容。然后,您将运行 splice ,它将删除Orange,然后将mutatedArray指向newArray的新值。
let newArray;
let mutatedArray;
function removeOneFruit() {
newArray=['Apple', 'Orange', 'Plums', 'Grapes'];
console.log("Before splicing: "+newArray);
newArray.splice(newArray.indexOf('Orange'),1);
mutatedArray= newArray;
console.log("After splicing: "+mutatedArray);
}
removeOneFruit()
答案 2 :(得分:0)
Slice不返回任何内容,因为第二个参数是结束索引。由于Orange为1,结尾为1,因此不会返回任何内容。
拼接-将删除的项目返回原始数组,即受影响的数组。
答案 3 :(得分:0)
阅读the docs!
newArray.slice(newArray.indexOf('Orange'), 1);
这将从索引newArray.indexOf('Orange')
(为1
)到但不包括索引1
剪切数组的一部分。最终以空数组结束。
如果您想从给定位置切出长度为2的切片,则可以这样做:
var a = [100, 200, 300, 400];
var pos = a.indexOf(200);
a.slice(pos, pos + 2); // == [ 200, 300 ]
如果您需要从数组中删除特定元素,那么最好只过滤它:
const newArray = ['Apple', 'Orange', 'Plums', 'Grapes'];
// Remove the first 'Orange'.
const orangeIx = newArray.indexOf('Orange');
console.log('Removed by index:',
newArray.filter((ignoredValue, index) => index != orangeIx));
// Remove every 'Orange'.
console.log('Removed by value:',
newArray.filter(fruit => fruit != 'Orange'));
请注意,上面的代码创建了原始数组的新浅表副本,而不是对其进行突变。