Как сделать функцию, которая принимает два набора со строками, которая возвращает эквивалентные значения?(Javascript) - PullRequest
1 голос
/ 22 апреля 2019

// РЕДАКТИРОВАТЬ: я использую Codehs для этой проблемы, и он не использует фильтр или имеет

функция start () {

var gifts = ["book","car"]; 

var presents = ["game","book"];

 var tim = new Set();

 var sally = new Set();

tim.add(gifts);

sally.add(presents);

  var ans = compare(tim,sally);

  println(ans);

//should print in "book"
}

function compare(first,second){
//code here
}

Я попытался перебрать элементы и использовать объединение set.union();. Я не знаю, где подойти к проблеме. Спасибо!

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Обратите внимание, что если вы ищете элементы, которые являются членами обоих наборов, это называется набором пересечение , а не набором объединением .

MDN содержит несколько примеров различных операций над множествами, включая пересечение:

var intersection = new Set([...set1].filter(x => set2.has(x)));

Вот как вы могли бы использовать свой код:

var compare = (a, b) => new Set([...a].filter(x => b.has(x)));

var gifts = new Set(["book", "car"]);
var presents = new Set(["game", "book"]);
var ans = compare(gifts, presents);

console.log(...ans);
1 голос
/ 23 апреля 2019

Вы можете получить массив элементов первого набора и отфильтровать его, взяв Set метод-прототип has с самим множеством.

В основном это

[...first].filter(Set.prototype.has, second)
    ^^^^^                                    the Set
 ^^^                                         take Set as iterable
^        ^                                   into array
           ^^^^^^                            filter the array
                  ^^^^^^^^^^^^^^^^^          by borrowing a method of Set
                                     ^^^^^^  with a Set

преобразует Set first в массив и принимает Array#filter с thisArg в качестве второго параметра.

function compare(first, second) {
    return [...first].filter(Set.prototype.has, second);
}

var gifts = ["book", "car"],
    presents = ["game", "book"],
    tim = new Set(gifts),
    sally = new Set(presents);

console.log(compare(tim, sally));
1 голос
/ 22 апреля 2019

Вы можете отфильтровать содержимое набора с помощью filter() и `has (). Но сначала нужно правильно поместить данные в наборы.

Это (к сожалению) не сработает:

tim.add(gifts);

потому что он добавит весь массив как один элемент набора. Вы можете сделать это только при создании набора:

var tim = new Set(gifts);

function start(){

    var gifts = ["book","car"]; 
    var presents = ["game","book"];   
    var tim = new Set(gifts);
    var sally = new Set(presents);
    
    var ans = compare(tim,sally);
    
    console.log(ans);
    
    }
    
function compare(first,second){
    return [...first].filter(item => second.has(item))
}
start()
...