Вы можете использовать reduce()
для создания объекта, только добавляя ключ, в котором найдено совпадение.
function objOfMatches(array1, array2, cb) {
return array1.reduce((obj, item) => {
if (array2.includes(cb(item))) obj[item] = cb(item)
return obj
}, {})
}
console.log(objOfMatches(['hi', 'howdy', 'bye', 'later', 'hello'], ['HI', 'Howdy', 'BYE', 'LATER', 'hello'], function(str) {
return str.toUpperCase();
}));
Это просто, но будет иметь поведение O (n²), потому что includes
просматривает array2
для каждого элемента в array1
.Это может не иметь значения для небольших списков, но если списки велики, возможно, стоит создать какой-то хеш (например, Set
или объект), чтобы дать вам постоянный поиск в array2
.
Что-то вроде:
function objOfMatches(array1, array2, cb) {
let set = new Set(array2)
return array1.reduce((obj, item) => {
if (set.has(cb(item))) obj[item] = cb(item)
return obj
}, {})
}
console.log(objOfMatches(['hi', 'howdy', 'bye', 'later', 'hello'], ['HI', 'Howdy', 'BYE', 'LATER', 'hello'], function(str) {
return str.toUpperCase();
}));