Сравнение структур массивов

249
29 июля 2018, 15:20

Как сравнить структуры двух массивов?

Функция должна проходить следующие тесты:

//Должен вернуть 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) { /*код*/ };
Answer 1

Возьмем за предположение, что в массиве только цифры и другие массивы

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]]));

Answer 2

Решение

В данный момент использую следующую функцию:

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]));

READ ALSO
Youtube iframe api

Youtube iframe api

Появилась задача, нужно воспроизводить видео с youtube при наведении на картинкуСделать получилось, но вот работает все это дело не очень

218
Смена css кода по клику

Смена css кода по клику

Есть вот такой код по клику на кнопку меняется фон и цвет текста body, как сделать что бы по клику той же кнопки менялись стили любого элемента(тега,...

210
Как javascript работает с таймаутами (setTimeout, setInterval)?

Как javascript работает с таймаутами (setTimeout, setInterval)?

Интересует именно куда эти таймауты помещаются, как очищаютсяА также где хранится информация о том, когда их нужно выполнить

163
JavaScript параметры Dom элемента

JavaScript параметры Dom элемента

Видел видео как тип прописал какую то команду в js скрипте и ему выбило весь список параметров для этого объекта в браузереКак это сделать...

206