创建一个不使用slice()进行切片的函数

问题描述 投票:1回答:2

我正在尝试编写一个名为slice的函数,该函数接受一个数组和两个数字。

  • 函数应该返回一个新数组,其元素从第一个数字的索引开始,一直到第二个数字的索引为止。

  • 如果没有将第三个参数传递给该函数,则默认情况下应将其切片直到数组的末尾。

  • 如果第三个参数大于数组的长度,则应切片直到数组的末尾。

function slice(s, n, m) {
  let a = [];
  a = s.splice(n, m);
  if(m === undefined || m > s.length) {
    a = s.splice(n, s.length);
  }
  return a;
}

let s = [1, 2, 3, 4, 5];
slice(s, 1, 7);

output []

UPDATE:

感谢大家的帮助;我知道了!!! 快乐的舞蹈

function slice(arr, start, end) {
let result = [];
from = Math.max(start, 0);
to = Math.min(end);

if((!end) || (end > arr.length)) {
  for(let i = from; i<arr.length; i++) {
  result.push(arr[i]);}
} else { 
  for(let i = from; i<to; i++) {
  result.push(arr[i]);
  }
}
return result;
}

slice([1, 2, 3, 4, 5], 2, 4);
javascript arrays slice
2个回答
2
投票

主要问题是.splice mutates数组,因此,在您第一次调用它时,您将删除该数组的一部分(或者您的情况是整个数组)。因此,如果代码输入if,并且您再次调用.splice,则该数组已经为空。 if / else将起作用,以便.splice仅被调用一次。

但是但这仍然不会复制.slice的行为,因为.slice不变异原始数组。因此,您需要一个循环,该循环将一个元素复制到另一个元素之后:

 // if "do" doesn't get passed, initialize with array.length (default parameter)
 function slice(array, from, to = array.length) {
   // make sure the bounds are within the range
   from = Math.max(from, 0);
   to = Math.min(to, array.length);
   // initialize an array we can copy values into
   const result = [];
   for(let index = from; index < to; index++) {
     // left as an exercise :)
   }
   return result;
 }

1
投票

自从OP说完作业时间以来回答了这个问题。

解决此问题的一种方法是具有指​​向第二和第三个参数的两个指针。如果提供了所有参数,则应从此开始]

start = n
end = m

// if m is greater than length of s or if m is not given
if(m == undefined || m > s.length()){
    end = s.length() - 1;
}

然后,这是一个简单的for循环,从头到尾,包括两端。

int[] result = new int[end-start+1];
for(int i = start; i <= end; i++){
    result[j] = s[i];
}

代码在语法上可能不是正确的,但是您可以解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.