Сопоставление анаграмм и отправка в массив

У меня есть данный word, который я хочу сопоставить с заданным списком слов, mainList, и установить, какие слова из этого заданного списка являются анаграммами данного слова, и добавить их в другой список, subList.

Я чувствую, что мой метод сделать это в порядке, но он возвращает неожиданный результат.

Например...

var word = 'master';
var mainList = ['stream', 'pidgeon', 'maters'];
var subList = [];

Затем я беру слово, разбиваю его на массив букв, упорядочиваю по алфавиту и снова соединяю в строку. С этой строкой я должен сопоставить любые возможные анаграммы (которые я буду скрывать таким же образом).

var mainSorted = [];

  for (i = 0; i < word.length; i++) {
     mainSorted = word.split('').sort().join();
  }

Вот где это идет не так. Я перебираю массив mainList, пытаясь установить, соответствует ли данный элемент при преобразовании оригиналу. Если это так, я хочу push слова в массив subList.

  for (var i = 0; i < mainList.length; i++) {
     var subSorted = mainList[i].split('').sort().join;
     if (mainSorted === subSorted) {
        subList.push(mainList[i])
     }
  }
  return subList;

... и значение, которое я ожидаю увидеть для subList: ['stream', 'maters']

Но вместо этого мне возвращается пустой массив.

Я прошел через это так много раз, и я не могу понять, что происходит не так, буду очень признателен за помощь!

Кроме того, я знаю, что, вероятно, есть более красноречивые методы сделать это (и я приветствую любые предложения), но в первую очередь я хочу увидеть, где это идет не так.

Заранее спасибо.


person Paulos3000    schedule 08.08.2016    source источник


Ответы (1)


Вы забыли () в конце соединения

var subSorted = mainList[i].split('').sort().join; 

должно быть

var subSorted = mainList[i].split('').sort().join();

Одна не проблема

for (i = 0; i ‹ word.length; i++) { mainSorted = word.split('').sort().join(); }

не нужно быть в цикле

 mainSorted = word.split('').sort().join();

одного достаточно

в качестве бонуса, вот более аккуратный способ делать то, что вы делаете

var word = 'master';
var mainList = ['stream', 'pidgeon', 'maters'];

var mainSorted = word.split('').sort().join();

return mainList.filter(function(sub) {
    return sub.split('').sort().join() == mainSorted;
});
person Jaromanda X    schedule 08.08.2016
comment
Я бился головой о кирпичную стену, и ЭТО было проблемой все это время. ХА. Спасибо!! :) - person Paulos3000; 08.08.2016
comment
Не уверен, почему я сделал цикл для mainSorted, который довольно очевиден в ретроспективе. Что касается filter(), я еще не начал его использовать, но выглядит как лучшая альтернатива - спасибо за этот совет. - person Paulos3000; 08.08.2016