Не могу совладать с задачей, прошу Вашей помощи!
Задача: Напишите функцию 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]));
На мой взгляд:
list.value
list.value
". Я пробовал splice, shift - но не получается.list.rest
нужно как-то рекурсивно передавать эту же функцию arrayToList
, только, соответственно, с удаленным первым элементом, чтобы он рекурсивно вызывалась до тех пор, пока исходный переданный массив не будет пустым.Буду очень признателен за помощь. Мне не совсем нужен код, как формальность в описании действий (я так лучше понимаю). Спасибо!
p.s. конкретно в моем примере должно получиться так:
console.log(arrayToList([1, 2, 3]);
{
value: 1,
rest: {
value 2,
rest: {
value: 3,
rest: undefined
}
}
}
Данную задачу можно решить с помощью свертки массива в объект. В данном случае сворачивать удобнее с конца, для этого нужно использовать метод reduceRight
.
Свертку можно выразить следующей последовательностью действий:
value
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]));
Предложу такой вариант (если я верно истолковал задание, пункт 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))
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть класс Point в котором существует метод showPoints() для вывода информации о точке с координатами и установкой координаты x и yСоздать...
У меня есть div, в котором распологаются img и aНужно вызвать событие при клике по любой области этого элемента: и по пустой, и по тем, где расположены...
Понимаю вопрос может быть не слишком понятен, но постараюсь изложить суть как можно яснееЕсть блоки в которых расположен контент, они имеют...
Есть блок div с названием класса penguin, мне нужно опустить данный блок на 10% вниз от родительского блока, но свойство top не применяетсяПробовал...