Как сравнить структуры двух массивов?
Функция должна проходить следующие тесты:
//Должен вернуть true
[1, 1, 1].hasSameStructure([2, 2, 2])
[1, 1, 1, [1, 2, 3, 4, 5]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5]])
[1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]])
[[[], []]].hasSameStructure([[[], []]])
//Должен вернуть false
[1, 1, 1].hasSameStructure([2, 2, 2, [2]])
[1, 1, 1, [1, 2, 3, 4, 5]].hasSameStructure([2, 2, 2])
[1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, [1, 2, 3, 4, 5]]])
[[[], []]].hasSameStructure([[1, 1]])
Каркас функции:
Array.prototype.hasSameStructure = function (array) { /*код*/ };
Возьмем за предположение, что в массиве только цифры и другие массивы
Array.prototype.hasSameStructure = function (b) {
// не буду здесь писать проверку, на то что входные данные это массивы
const a = this;
if(a.length !== b.length) return false;
const isArray = Array.isArray;
const aLength = a.length;
for(let i = 0; i < aLength; i++) {
const aValue = a[i];
const bValue = b[i];
if(isArray(aValue) !== isArray(bValue)) {
return false;
}
if(isArray(aValue) && isArray(bValue)) {
const result = aValue.hasSameStructure(bValue);
if(!result) return false;
}
}
return true;
}
//Должен вернуть true
console.log([1, 1, 1]
.hasSameStructure([2, 2, 2]));
console.log([1, 1, 1, [1, 2, 3, 4, 5]]
.hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5]]));
console.log([1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]]
.hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]]));
console.log([[[], []]]
.hasSameStructure([[[], []]]));
//Должен вернуть false
console.log([1, 1, 1]
.hasSameStructure([2, 2, 2, [2]]));
console.log([1, 1, 1, [1, 2, 3, 4, 5]]
.hasSameStructure([2, 2, 2]));
console.log([1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]]
.hasSameStructure([2, 2, 2, [1, 2, 3, 4, [1, 2, 3, 4, 5]]]));
console.log([[[], []]]
.hasSameStructure([[1, 1]]));
В данный момент использую следующую функцию:
Array.prototype.hasSameStructure = function (array) {
if (!Array.isArray(array) || this.length != array.length)
return false;
for (var i = 0; i < this.length; ++i) {
if (Array.isArray(this[i])) {
if (!this[i].hasSameStructure(array[i])) {
return false;
}
} else if (Array.isArray(array[i])) {
return false;
}
}
return true;
};
//Должен вернуть true
console.log([1, 1, 1].hasSameStructure([2, 2, 2]));
console.log([1, 1, 1, [1, 2, 3, 4, 5]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5]]));
console.log([1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]]));
console.log([[[], []]].hasSameStructure([[[], []]]))
// //Должен вернуть false
console.log([1, 1, 1].hasSameStructure([2, 2, 2, [2]]));
console.log([1, 1, 1, [1, 2, 3, 4, 5]].hasSameStructure([2, 2, 2]));
console.log([1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, [1, 2, 3, 4, 5]]]));
console.log([[[], []]].hasSameStructure([[1, 1]]));
Функция проходит все тесты. Но хотелось бы реализовать ее под более "свежий" стандарт, и использовать маленькую стрелочную функцию.
Array.prototype.hasSameStructure = function (array) {
return this.length == array.length && this.every((element, index) => Array.isArray(element) == Array.isArray(array[index]) && (!Array.isArray(element) || element.hasSameStructure(array[index])));
};
//Должен вернуть true
console.log([1, 1, 1].hasSameStructure([2, 2, 2]));
console.log([1, 1, 1, [1, 2, 3, 4, 5]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5]]));
console.log([1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]]));
console.log([[[], []]].hasSameStructure([[[], []]]))
// //Должен вернуть false
console.log([1, 1, 1].hasSameStructure([2, 2, 2, [2]]));
console.log([1, 1, 1, [1, 2, 3, 4, 5]].hasSameStructure([2, 2, 2]));
console.log([1, 1, 1, [1, 2, 3, 4, 5, [1, 2, 3, 4, 5]]].hasSameStructure([2, 2, 2, [1, 2, 3, 4, [1, 2, 3, 4, 5]]]));
console.log([[[], []]].hasSameStructure([[1, 1]]));
console.log([1, [1]].hasSameStructure([2, 2]));
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Появилась задача, нужно воспроизводить видео с youtube при наведении на картинкуСделать получилось, но вот работает все это дело не очень
Есть вот такой код по клику на кнопку меняется фон и цвет текста body, как сделать что бы по клику той же кнопки менялись стили любого элемента(тега,...
Интересует именно куда эти таймауты помещаются, как очищаютсяА также где хранится информация о том, когда их нужно выполнить
Видел видео как тип прописал какую то команду в js скрипте и ему выбило весь список параметров для этого объекта в браузереКак это сделать...