首页 > 解决方案 > 通过循环两个数组来构建对象

问题描述

很简单。

我需要构造一个objOfMatches接受两个数组和一个回调的函数。objOfMatches 将构建一个对象并返回它。要构建对象,objOfMatches将使用回调测试第一个数组的每个元素,以查看输出是否与第二个数组的相应元素(按索引)匹配。如果匹配,则第一个数组中的元素成为对象中的键,第二个数组中的元素成为对应的值。

function objOfMatches(array1, array2, callback) {
    //create obj
    var obj = {}

    //loop thru first array
    for(let i = 0; i < array1.length; i++) {
        for (let j = 0; j < array2.length; j++) {
            if (callback(array1[i]) === array2[j]) {                
                obj.array1[i] = array2[j];
            }
        }
    }
    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' }

看起来很简单,但我不完全理解为什么它会在控制台中抛出 TypeError 。(TypeError: Cannot set property '0' of undefined)

有人可以解释发生了什么吗?

标签: javascriptarraysobjectmultidimensional-array

解决方案


如果要匹配相应的元素,则无需遍历两个数组。您可以遍历一个并使用索引在另一个中找到相应的对象。

reduce()这样做很好,因为它可以让您在适当的位置构建返回对象,并提供当前循环迭代的索引。如果测试为真,您只需运行测试并分配键/值。

function objOfMatches(arr1, arr2, callback){
  return arr1.reduce((obj, current, index) => {
    if(arr2[index] === callback(current)) obj[current] = arr2[index]
    return obj
  }, {})
}

console.log(objOfMatches(['hi', 'howdy', 'bye', 'later', 'hello'], ['HI', 'Howdy', 'BYE', 'LATER', 'hello'], function(str) { return str.toUpperCase(); }));


推荐阅读