Получение значения из массива module.exports с использованием подстановочных знаков, таких как «include» - PullRequest
0 голосов
/ 12 марта 2019

Привет, у меня есть модуль экспорта как таковой.

module.exports = {
"Computer screen": 'phrase1',
"Table height": 'phrase2',
"Temperature": 'phrase3',
};

И импорт файла, который имеет это, используя 'require', в переменную под названием try.Затем я использую следующий код для поиска в module.exports.Например, если searchQuery был «экран компьютера», он вернул бы «фразу1».

var tryThis = tries[searchQuery];

Мой вопрос: как я могу изменить это, чтобы он искал любую строку, содержащую поисковый запрос.Например, поиск по «таблице» вернул бы «фразу2».

Пожалуйста, помогите :) спасибо вперед.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

То, что вы экспортируете, это объект со свойствами. Вы можете циклически просматривать имена свойств объекта, используя цикл for-in (который включает в себя все перечисляемые свойства объекта, как собственные, так и унаследованные), или используя массив из Object.keys (который включает только собственные перечисляемые свойства). Тогда вы можете использовать includes для каждого имени свойства.

Для вашего конкретного примера вы можете использовать Object.entries (совсем недавно, но легко заполняется), так как вы можете захотеть значение; возвращает массив из [key, value] массивов.

Кажется, вы используете только синтаксис уровня ES5, поэтому:

var tryThis;
Object.entries(tries).some(function(entry) {
    if (entry[0].includes(searchQuery)) {
        tryThis = entry[1];
        return true;
    }
});

... или, возможно, entry[0].toLowerCase().includes(searchQueryLower) (где у вас есть searchQueryLower = searchQuery.toLowerCase()), если вы хотите сопоставление без учета регистра.

Живой пример:

var tries = {
"Computer screen": 'phrase1',
"Table height": 'phrase2',
"Temperature": 'phrase3',
};
var searchQuery = "Table";
var searchQueryLower = searchQuery.toLowerCase();

var tryThis;
Object.entries(tries).some(function(entry) {
    if (entry[0].toLowerCase().includes(searchQueryLower)) {
        tryThis = entry[1];
        return true;
    }
});

console.log(tryThis);

В ES2015 + я бы использовал for-of и деструктуризацию:

let tryThis;
for (const [key, value] of Object.entries(tries)) {
    if (key.toLowerCase().includes(searchQueryLower)) {
        tryThis = value;
        break;
    }
}

Живой пример:

const tries = {
  "Computer screen": 'phrase1',
  "Table height": 'phrase2',
  "Temperature": 'phrase3',
};
const searchQuery = "Table";
const searchQueryLower = searchQuery.toLowerCase();

let tryThis;
for (const [key, value] of Object.entries(tries)) {
    if (key.toLowerCase().includes(searchQueryLower)) {
        tryThis = value;
        break;
    }
}

console.log(tryThis);

Конечно, вы можете вставить это в вызов reduce (потому что любая операция с массивом может быть вставлена ​​в вызов reduce), но это ничего вам не даст (и вы не можете остановиться, когда вы найти то, что вы ищете). Точно так же это можно сделать с map и filter.

0 голосов
/ 12 марта 2019

const search = (exports, word) => (Object.entries(exports).find(([name, value]) => name.toLowerCase().includes(word.toLowerCase())) || [])[1]


const module = {}
module.exports = {
  "Computer screen": 'phrase1',
  "Table height": 'phrase2',
  "Temperature": 'phrase3'
};

console.log(search(module.exports, "table"))
console.log(search(module.exports, "fffff"))
...