js - вывести наиболее подходящий список - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в JS и мне нужна помощь. В этом примере: у меня есть List, в этом списке есть «ключевые слова» в массиве.

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

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

Javascript: поиск массива в массиве массивов

-> Поэтому я хочу, чтобы при поиске ["apple", "strawberry"] скрипт выводил наиболее подходящий список.

Это была моя идея, я пробовал много вещей ... но ничего не получилось как я и должен был.


var groups = [
    {name: 'fruits', words:["apple","strawberry", "banana"]},
    {name: 'test', words:["asd","qwe"]}
];

var searchwords = ["apple", "strawberry"];

for(i = 0; i < groups.length; i++) {
    console.log(groups[i]);
    for(i = 0; i < searchwords.length; i++) {
        console.log(searchwords[i]);
        console.log('The most matching list is: ' + groups.name);
    }
}

Выход должен быть:

Лучшая группа - это группа "фрукты".

И я хочу список (вывод), вот так:

result = [2,0]

«2» для списка «фрукты», потому что есть 2 слова в этом. «0» для списка «test», потому что нет подходящих слов.

Спасибо!

Ответы [ 3 ]

1 голос
/ 12 апреля 2020

Я не буду давать вам полный ответ, но вот что вы должны делать.

for(i = 0; i < groups.length; i++){

}

Эта первая часть верна! Вы будете перебирать каждую группу. Теперь вам нужно выполнить итерации по каждому фрукту в текущей группе.

for(i = 0; i < groups.length; i++){
    for(j = 0; j < groups[i].words.length; ++j){

    }
}

Это даст вам доступ к каждому фрукту в текущей группе. Теперь вам нужно найти способ подсчитать, сколько раз фрукт был повторен; возможно, вам следует создать новый словарь для этого.

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

0 голосов
/ 12 апреля 2020

Есть несколько способов сделать это. Один я бы предпочел:

const result = groups.map(group => {
    const matchedwords = group.words.filter(word => searchwords.includes(word));
    return matchedwords.length;
}

PS: следуйте ответу Кибе, чтобы попытаться решить, как у вас дела. Я также рекомендую вам посмотреть документацию map и filter , если вы с ними не знакомы. Они очень удобны при работе с массивами.

0 голосов
/ 12 апреля 2020

Попробуйте сами, используя подсказки, которые Кибе дал первым. Это один из способов сделать это, я постарался сохранить ваш исходный код как можно больше и написал желаемые результаты. Надеюсь, поможет! Дайте мне знать, если что-то не имеет смысла / если вам нужно что-то объяснить.

var groups = [
    {name: 'fruits', words:["apple","strawberry", "banana"]},
    {name: 'test', words:["asd","qwe"]}
];

var searchwords = ["apple", "strawberry"];

// Initialize empty array with size equal to size of groups
var res = Array(groups.length).fill(0);
// Initialize variables to hold biggest number of matches and index of said matches
var biggestIndex;
var biggestValue = 0;

for(i = 0; i < groups.length; i++) {
    for(j = 0; j < groups[i].words.length; j++) {
        if(searchwords.includes(groups[i].words[j]) == true){
            res[i] += 1;
            if(res[i] > biggestValue){
                biggestValue = res[i];
                biggestIndex = i;
            }
        }
    }
}

// biggestIndex holds the index with the most matches
console.log("The best group is", groups[biggestIndex].name, "group");
// Res holds the list output you wanted
console.log(res);

https://jsfiddle.net/w9nqr02m/

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