【问题标题】:Create a function to slice without using slice()创建一个函数来切片而不使用 slice()
【发布时间】:2020-02-21 22:03:48
【问题描述】:

我正在尝试编写一个名为 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 []

更新:

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

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);

【问题讨论】:

  • 我建议使用描述性变量名而不是单个字符。
  • @clark 这些不是互斥的。
  • 同意 clark 的观点,你需要自己做这件事。不过,我可以给你一些提示:在数组中有一个指向第二个和第三个参数的指针。
  • 欢迎来到 SO! It's OK to ask about homework 无论如何,但这里的问题是没有人提出任何问题。 OP,你能多写一点关于你的尝试吗?例如,您为什么使用splice?你的思考过程是什么?请询问有关您的代码的具体问题。谢谢!
  • 重新开始 :-) splice 函数修改了一个数组,但 slice 没有 - 所以你不能使用 splice 重新发明 slice。该练习可能希望您对要放置在新数组中的元素使用循环和一些逻辑测试。

标签: javascript arrays slice


【解决方案1】:

主要问题是.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;
 }

【讨论】:

    【解决方案2】:

    因为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];
    }
    

    代码可能在语法上不正确,但您可以修复它。

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2019-01-07
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多