javascript - 如何根据多个数组的匹配创建一个对象

标签 javascript arrays object

给定 array1array2 我应该创建一个对象,其中属性和值来自两个数组之间的交集匹配。

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/

相关文章:

javascript - jQuery Slimscroll 到具有固定标题的 HTML 表格

javascript - 删除 gsheet 中的第一行并将行向上移动

javascript - 如何交替数组中的值?

python - 为什么像 abs 这样的内置函数适用于 numpy 数组?

java - 将 ArrayList<Object[]> 转换为 Object[]

python - 如何知道数组和字典等python对象的字节大小? - 简单的方法

android - 如何使用 parse.com android 从不同的表中获取 ObjectId

javascript - backbone.js 用于将模型与另一个模型连接

java - Java 中的集合排序

javascript - 简单的 JavaScript 拆分函数