Получение массива строк - PullRequest
1 голос
/ 27 мая 2020

У меня есть слово, и я хочу получить массив псевдонимов, которые я создаю для этого слова. Например, у меня будет массив ["hello", "hi", "hey", "yo"]. Если мое слово "hey", то я хочу получить весь этот массив. Моей первой идеей было использовать такие объекты:

let aliasdict = {
   "hello": ["hello", "hi", "hey", "yo"],
   "hi": ["hello", "hi", "hey", "yo],
   "hey": ["hello", "hi", "hey", "yo"],
   "yo": ["hello", "hi", "hey", "yo"],
}

Уловка в том, что я планирую иметь более 100 различных фраз, каждая с 2-4 разными псевдонимами. Так что это будет примерно так:

let aliasdict = {
   "hello": ["hello", "hi", "hey", "yo"],
   "hi": ["hello", "hi", "hey", "yo],
   "hey": ["hello", "hi", "hey", "yo"],
   "yo": ["hello", "hi", "hey", "yo"],

   "blue": ["blue", "green", "white"],
   "green": ["blue", "green", "white"],
   "white": ["blue", "green", "white"],

   "head": ["head", "knees", "tail"],
   ...
   ...
}

Количество необходимого копирования-вставки вызывает у меня некоторое отвращение, поэтому я хочу спросить, есть ли более простое решение без такого большого копирования-вставки и без отвлечения внимания. от скорости использования словарей.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 27 мая 2020

Псевдоним

const alias = (list = []) => list.reduce((group, alias, index, aliases) => ({
   ...group,
   [alias]: aliases,
}), {});

Словарь

const dictionary = (...lists) => lists.reduce((dictionary, list) => ({
   ...dictionary,
   ...alias(list),
}), {});

Орудие

dictionary(
  ["hello", "hi", "hey", "yo"],
  ["goodbye", "by", "bye", "piece"]
);

Вывод

{
  "hello": [
    "hello",
    "hi",
    "hey",
    "yo"
  ],
  "hi": [
    "hello",
    "hi",
    "hey",
    "yo"
  ],
  "hey": [
    "hello",
    "hi",
    "hey",
    "yo"
  ],
  "yo": [
    "hello",
    "hi",
    "hey",
    "yo"
  ],
  "goodbye": [
    "goodbye",
    "by",
    "bye",
    "piece"
  ],
  "by": [
    "goodbye",
    "by",
    "bye",
    "piece"
  ],
  "bye": [
    "goodbye",
    "by",
    "bye",
    "piece"
  ],
  "piece": [
    "goodbye",
    "by",
    "bye",
    "piece"
  ]
}

Проблемы времени У вас должен быть довольно большой список или приложение, которое действительно заботится о скорости для этого объема обработки, чтобы оказывают какое-либо заметное негативное влияние на ваше приложение.

При этом, если ваш словарь становится достаточно большим, чтобы повлиять на остальную часть вашего приложения, вы можете запустить эти функции и скопировать вывод, чтобы вы не разрешали вывод во время выполнения.

0 голосов
/ 27 мая 2020

Есть много способов и способов сделать это лучше. Но вот один способ.

function getAliases(find,array) {
 for (let i in array) {
  if (array[i].findIndex(element => element==find)>-1) return array[i];}
 return "";  
}

//=============================
let aliasdic = [
  ["hello", "hi", "hey", "yo"],
  ["blue", "green", "white"],
  ["head", "knees", "tail","back"]
  ];

console.log(getAliases("hey"  ,aliasdic));    // Array ["hello", "hi", "hey", "yo"]
console.log(getAliases("green",aliasdic));    //Array ["blue", "green", "white"]
0 голосов
/ 27 мая 2020

Вы можете использовать метод с оператором switch, если использование объекта не является ограничением.

function getAlias(key) {
    switch(key) {
       case "hello":
       case "hey":
       case "yo":
          return ["hello", "hi", "hey", "yo"];

       case "blue":
       case "green":
           return ["blue", "green"];
    }
}

0 голосов
/ 27 мая 2020

Вы можете просматривать каждое слово как узел на графике. Затем для каждой связанной пары слов вы формируете соединение между двумя узлами.

Таким образом, вы можете использовать список смежности для формирования своей структуры данных.

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

https://www.geeksforgeeks.org/implementation-graph-javascript/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...