Построить список из масива

206
15 декабря 2021, 01:10

Не могу совладать с задачей, прошу Вашей помощи!

Задача: Напишите функцию arrayToList, которая строит такую структуру, получая в качестве аргумента [1, 2, 3]

console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}

Решение: сейчас я вижу такое решение, но описать его кодом не могу (если, конечно, придуманное мною решение в принципе решает поставленную задачу.

Что я сделал

function arrayToList(array) { 
 
  var list = { 
    value: null, 
    rest: {} 
  }; 
 
  for (let i = 0; i < array.length; i++) { 
    list.value = array[i]; 
    list.rest = array.splice(0,1); 
  } 
  return list; 
} 
 
console.log(arrayToList([1,2,3]));

На мой взгляд:

  1. Нужно пройтись по каждому элементу массива, переданного в качестве аргумента.
  2. Первый элемент переданого массива присвоить методу list.value
  3. После этого, нужно "каким-то образом" получить "исходный массив - первый элемент, ранее присвоенный list.value". Я пробовал splice, shift - но не получается.
  4. Почему-то мне кажется, что методу list.rest нужно как-то рекурсивно передавать эту же функцию arrayToList, только, соответственно, с удаленным первым элементом, чтобы он рекурсивно вызывалась до тех пор, пока исходный переданный массив не будет пустым.
  5. Но, ничего не выходит.

Буду очень признателен за помощь. Мне не совсем нужен код, как формальность в описании действий (я так лучше понимаю). Спасибо!

p.s. конкретно в моем примере должно получиться так:

console.log(arrayToList([1, 2, 3]);
{ 
    value: 1,
    rest: {
        value 2,
        rest: {
            value: 3,
            rest: undefined
        }
    }
}
Answer 1

Данную задачу можно решить с помощью свертки массива в объект. В данном случае сворачивать удобнее с конца, для этого нужно использовать метод reduceRight.

Свертку можно выразить следующей последовательностью действий:

  1. создать объект
  2. текущий элемент записать в поле value
  3. то что пришло с предыдущего шага записать в поле rest

function arrayToList(array) { 
  return array.reduceRight((acc, cur) => ({ 
    value: cur, 
    rest: acc 
  }), null) 
} 
 
console.log(arrayToList([1, 2, 3])); 
console.log(arrayToList([10, 20]));

Те же шаги можно сделать и с помощью рекурсии

function arrayToList(array) { 
  if (array.length == 0) return null; 
  var [value, ...rest] = array; 
  return { 
    value, 
    rest: arrayToList(rest) 
  }; 
} 
 
console.log(arrayToList([1, 2, 3])); 
console.log(arrayToList([10, 20]));

Answer 2

Предложу такой вариант (если я верно истолковал задание, пункт 3 не мовсем прозрачен для меня) :

function arrayToList(array) { 
  // проверяем что мы чтото получили в аргумент  
  // и ето чтото масив, с количеством елементов > 0 
  if (!array || !Array.isArray(array) || !array.length) 
    // тут нужно еще подумать, что именно возвращать (в зависимости что вам нужно) 
    return undefined 
 
  var list = { 
    // сразу нулевой елемент присваиваем в value 
    value: array[0], 
    rest: {} 
  } 
 
  // проверяем если длина масива > 0 то удаляем первый елемент 
  // а в поле rest присваиваем результат выполения етой же функции над новым масивом (рекурсия) 
  if (array.length) { 
    array.shift() 
    list.rest = arrayToList(array) 
  } 
 
  return list 
} 
 
const listToArray = list => { 
  const res = [] 
  res.push(list.value) 
 
  if (list.rest) 
    return [...res, ...listToArray(list.rest)] 
 
  return res 
} 
 
const res = arrayToList([1, 2, 3]) 
console.log(res) 
console.log(listToArray(res))

READ ALSO
Как правильно переопределить метод

Как правильно переопределить метод

У меня есть класс Point в котором существует метод showPoints() для вывода информации о точке с координатами и установкой координаты x и yСоздать...

191
Как правильно &#39;перехватить&#39; событие?

Как правильно 'перехватить' событие?

У меня есть div, в котором распологаются img и aНужно вызвать событие при клике по любой области этого элемента: и по пустой, и по тем, где расположены...

129
Независимый блок

Независимый блок

Понимаю вопрос может быть не слишком понятен, но постараюсь изложить суть как можно яснееЕсть блоки в которых расположен контент, они имеют...

95
Не применяется свойство top к div блоку

Не применяется свойство top к div блоку

Есть блок div с названием класса penguin, мне нужно опустить данный блок на 10% вниз от родительского блока, но свойство top не применяетсяПробовал...

182