該函式已使用回呼測驗第一個陣列的每個元素,以查看輸出是否與第二個陣列的相應元素(按索引)匹配。如果匹配,則第一個陣列中的元素成為物件中的鍵,第二個陣列中的元素成為對應的值。
function objOfMatches(arr1, arr2, callback){
let obj ={};
let newArr1 = arr1.toString();
newArr1 = callback(newArr1);
newArr1 = newArr1.split(",");
arr1.forEach(el=>{
if((callback(newArr1) === arr2[el])) obj[arr1[el]] = arr2[el];
});
return obj;
}
我遇到的問題是,當我這樣呼叫函式時:
const arr1 = ['hi', 'howdy', 'bye', 'later', 'hello'];
const arr2 = ['HI', 'Howdy', 'BYE', 'later', 'HELLO'];
function uppercaser(str) { return str.toUpperCase(); };
console.log(objOfMatches(arr1, arr2, uppercaser));
它給出了一個錯誤(第 18 行的型別錯誤:str.toUpperCase 不是函式)。
但是,如果與 FOR 回圈而不是 .forEach 一起使用,它可以正常作業,如下所示:
for(let i=0; i<arr1.length; i ){
if(callback(arr1[i]) === arr2[i]){
obj[arr1[i]] = arr2[i];
}
}
有人可以用 JS 初級語言向我解釋為什么它不起作用嗎?
uj5u.com熱心網友回復:
簡而言之,newArr1
當您呼叫 時,它已成為一個陣列.toUpperCase()
,因此出現了 TypeError。讓我們仔細看看你的功能:
function objOfMatches(arr1, arr2, callback) {
let obj = {};
let newArr1 = arr1.toString(); // string
newArr1 = callback(newArr1); // string
newArr1 = newArr1.split(','); // array
arr1.forEach((el) => {
if (callback(newArr1) === arr2[el]) { // Error, newArr1 is an array and doesn't have the method .toUpperCase()
obj[arr1[el]] = arr2[el];
}
});
return obj;
}
更不用說,你的功能邏輯是錯誤的。根據您的描述,應該更像這樣:
function objOfMatches(arr1, arr2, callback) {
let obj = {};
arr1.forEach((el, index) => {
if (callback(el) === arr2[index]) {
obj[el] = arr2[index]; // E.g. { 'hi': 'HI' }
}
});
return obj;
}
for 回圈版本實際上是正確的,所以它可以作業:
function objOfMatches(arr1, arr2, callback) {
let obj = {};
for(let i=0; i<arr1.length; i ){
if(callback(arr1[i]) === arr2[i]){ // Correct, arr1 is an array of string so each string will have .toUpperCase()
obj[arr1[i]] = arr2[i];
}
}
return obj;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488752.html
標籤:javascript 数组 目的 前锋