给定 array1
和 array2
我应该创建一个对象,其中属性和值来自两个数组之间的交集匹配。
function objOfMatches(array1, array2, cb) {
var obj = {};
var newArray1 = array1.map(cb);
for (let i = 0; i < newArray1.length; i++) {
if( !(array2.indexOf(newArray1[i]) == -1) ) {
obj[newArray1[i].toLowerCase()] = newArray1[i];
}
}
return obj;
}
console.log(objOfMatches(['hi', 'howdy', 'bye', 'later', 'hello'], ['HI', 'Howdy', 'BYE', 'LATER', 'hello'], function(str) { return str.toUpperCase(); }));
// should log: { hi: 'HI', bye: 'BYE', later: 'LATER' }
有没有比这个实现更好或更简洁的方法来编写它?
最佳答案
您可以使用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();
}));
关于javascript - 如何根据多个数组的匹配创建一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53795262/