如何正确使用拼接和切片[Typescript]

时间:2019-12-26 18:43:17

标签: javascript typescript

我是typescript的新手。我很抱歉提出这样的基本问题。但是我无法在我的代码中找出问题所在。我已经阅读了许多有关slicesplice的文章。我想在我的有角度的项目中使用它们(而不是两个都一起使用)。我得到了意外的输出。这是我的代码:

使用切片时:

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:它是一个大型项目的微型模型,其中的结果不是成果,而且也不会进行硬编码。

4 个答案:

答案 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'));

请注意,上面的代码创建了原始数组的新浅表副本,而不是对其进行突变。