javascript - 通过循环两个数组来构建对象
问题描述
很简单。
我需要构造一个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)
有人可以解释发生了什么吗?
解决方案
如果要匹配相应的元素,则无需遍历两个数组。您可以遍历一个并使用索引在另一个中找到相应的对象。
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(); }));
推荐阅读
- ruby-on-rails - Rails 5.1 多个 belongs_to 关联,可选:true,rollback - '必需的关联'
- php - 在对数据库的其他调用中使用返回的 ajax ID
- node.js - 如何正确发送参数和标头以获取 swagger 客户端?
- c# - 无法使用 ajax C# 发送字符串数组
- hyperledger-fabric - 编写 Hyperledger Fabric 链码时要遵循的最佳实践
- xml - 使用 XSLT 进行单词和短语计数
- jquery - Fancybox - 无法加载请求的内容 - 从数组加载 fancybox
- python - 将两个输入文件传递给函数会导致不良结果
- excel - 获取 Top10 值而不重复类别列中的任何项目
- python-3.x - 具有级联 QSortFilterProxyModel 的信号顺序