首页 > 解决方案 > 如何从多个数组的匹配中创建对象

问题描述

给定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' }

有没有比这个实现更好或更干净的方法来编写它?

标签: javascriptarraysobject

解决方案


很不清楚该函数应该做什么,这使得它难以阅读。相反,您应该分开任务:

  const intersection = (a, b) => a.filter(it => b.includes(it));
  const toMap = (values, mapper) => Object.assign({}, ...values.map(value => ({ [mapper(value)]: value })));

  const matches = intersection(array1.map(it => it.toUpperCase()), array2);
  const result = toMap(matches, value => value.toLowerCase());

推荐阅读