newdecline
@newdecline
Front-end-developer

Как сделать функцию которая принимает любое количество массивов и удаляет из каждого массива первый элемент?

Как сделать функцию которая принимает любое количество массивов и удаляет из каждого массива первый элемент ?
https://codepen.io/newdecline/pen/jpLQWQ
  • Вопрос задан
  • 5277 просмотров
Решения вопроса 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
changeCollection как этой главной функции указать то что будет принимать сколько угодное количество массивов , а последним будет обработчик ?
В современном js вот так: changeCollection(...arrays, handler)
В arrays будет массив с переданными массивами.

Если по классике, то вот так:
function changeCollection() {
    var handler = arguments[arguments.length - 1];
    
    for (var i = 0; i < arguments.length - 1; i++) {
      var array = arguments[i];
      
      handler(array);
    }
}


Кстати, обратите внимание, что массивы в js передаются по ссылке, поэтому изменяя переданные аргументы вы изменяете и оригиналы:
function changeCollection() {
  var handler = arguments[arguments.length - 1];
    
  for (var i = 0; i < arguments.length - 1; i++) {
    var array = arguments[i];
      
    handler(array);
  }
}

function deleteFunc(array) {
  array.shift();
}

var one = [1 ,2 ,3];
var two = ['b', 'c'];

changeCollection(one, two, deleteFunc)

console.log(one, two); // [2, 3] ['c']

Если вас такое поведение не устраивает, нужно делать копии и изменять и возвращать их. Для этого лучше воспользоваться готовыми библиотеками и не писать свой велосипед. В современном js, опять же, можно воспользоваться встроенными средствами: const clone = [...original];. Но если у вас внутри массивов не примитивы и вы изменяете элементы, то нужно делать глубокое копирование.
Ответ написан
Zatmil
@Zatmil
Fullstack-разработчик
Можно в первом аргументе передавать массив-массивов, а во втором - обработчик
Ответ написан
Комментировать
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
В JS функции могут принимать ограниченное число аргументов, так что передавать любое число аргументов в функции нельзя и поэтому следует передавать в функцию массив с массивами:
function(arrays, cb){
    var len = arrays.length;
    for (var i = 0; i < len; i++) {
        cb(arrays[i]);
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kobancheg
Столкнулся с таким же заданием, получилось решить вот так:
function changeCollection() {
  for (let i = 0; i <= arguments.length - 1; i++) {
    arguments[i].splice(0, 1);
  }
}

let a = [1, 2, 3, 4];
let b = ["a", "b", "c"];
let c = ["hello", "world"];

changeCollection(a, b, c);

console.log(a, b, c); // [2, 3, 4] ["b", "c"] ["world"]


вот ещё вариант с записью массивов прямо в функию:

function changeCollection() {
  let res =[];
  for (let i = 0; i < arguments.length; i++) {
    arguments[i].shift();
    res.push(arguments[i]);
  }
  return res;
}
console.log(changeCollection([1, 2, 3, 4], ['a', 'b', 'c'], ['helloy', 'world']));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы