Создать функцию для нарезки без использования slice () - PullRequest
1 голос
/ 22 февраля 2020

Я пытаюсь написать функцию с именем 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);

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Основная проблема в том, что .splice мутирует массив, поэтому при первом обращении к нему вы удаляете часть массива (или, в вашем случае, весь массив). Поэтому, если код входит в if и вы вызываете .splice второй раз, массив уже пуст. If / else будет работать так, чтобы .splice вызывался только один раз.

Но это все равно не повторило бы поведение .slice, так как .slice не не изменяет исходный массив . Поэтому вам, скорее, понадобится al oop, который копирует один элемент за другим:

 // 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 голос
/ 22 февраля 2020

Отвечая на это, поскольку ОП сказал, что время для домашней работы прошло.

Один из способов решения этой проблемы - два указателя на второй и третий аргументы. Если у вас есть все приведенные аргументы, вот как вы должны начать

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

, тогда это просто для l oop от начала до конца, включая оба.

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

Код может быть неверно синтаксически, но вы можете это исправить.

...