2017-01-05 7 views
0

私はJSの初心者で、以下のコードで何が起こっているのかを理解しようとしています。おそらくそれは何かばかだが、私が言ったように、初心者だよ)配列の奇妙な動作 - 理由を理解できない

まず、makeFriendlyDates(['2016-07-01', '2016-08-04']);の引数である配列を分割するだけである。

だから、この段階ではすべてが大丈夫です。しかし、私がfunction changeToFriendly(arr1);と呼ぶときには、数字だけを月の名前に変えて、どういうわけかnewArrも変えてしまいます。私は、この行をコメントアウトする場合

だから://changeToFriendly(newArr);はその後newArrはあるべきであるものですが、changeToFriendly(newArr);が呼び出された場合、それは何とかちょうど月の名前を返す代わりにnewArrを変更します。

私の質問は、newArrが、配列を使って何もしない場合、それを横断して月の名前に対応する番号を調べるだけで、newArrを変更できることです。

function makeFriendlyDates(arr) { 
 
    var newArr = []; 
 
    var elem; 
 
    for (elem in arr) { 
 
    newArr.push(arr[elem].split('-')); 
 
    } 
 
    document.getElementById('result').innerHTML = newArr; 
 

 
    function changeToFriendly(arr1) { 
 
    var month = ''; 
 
    var elem1; 
 
    for (elem1 in arr1) { 
 
     if (arr1[elem1][1] = '01') { 
 
     month = 'January'; 
 
     } else if (arr1[elem1][1] === '02') { 
 
     month = 'February'; 
 
     } else if (arr1[elem1][1] === '03') { 
 
     month = 'March'; 
 
     } else if (arr1[elem1][1] === '04') { 
 
     month = 'April'; 
 
     } else if (arr1[elem1][1] === '05') { 
 
     month = 'May'; 
 
     } else if (arr1[elem1][1] === '06') { 
 
     month = 'June'; 
 
     } else if (arr1[elem1][1] === '07') { 
 
     month = 'July'; 
 
     } else if (arr1[elem1][1] === '08') { 
 
     month = 'August'; 
 
     } else if (arr1[elem1][1] === '09') { 
 
     month = 'September'; 
 
     } else if (arr1[elem1][1] === '10') { 
 
     month = 'October'; 
 
     } else if (arr1[elem1][1] === '11') { 
 
     month = 'November'; 
 
     } else if (arr1[elem1][1] === '12') { 
 
     month = 'December'; 
 
     } 
 

 
    } 
 
    document.getElementById('result1').innerHTML = newArr; 
 
    return month; 
 
    } 
 

 
    changeToFriendly(newArr); 
 
} 
 
makeFriendlyDates(['2016-07-01', '2016-08-04']);
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>Title</title> 
 
</head> 
 

 
<body> 
 

 
    <p id="result"></p> 
 
    <p id="result1"></p> 
 

 
</body> 
 

 
</html>

+3

'for..in'はループオブジェクト用であり、配列用ではありません。通常の 'for'ループが必要です。 – elclanrs

+0

配列もオブジェクトではありませんか? – S1awek

+0

これは非常に簡単な間違いです。 「〜のために〜」は、その意味においてほとんど欺瞞的です。 – Amy

答えて

5

あなたの問題は、おそらくここに、単一の=です:あなたifを意味

for (elem1 in arr1) { 
     if (arr1[elem1][1] = '01') { 
         ^^^ 

が...常にtrueに評価されます。

+1

タイプミスには答えないことを知っておく必要があります。その代わりにそれを閉じてください – 4castle

+0

それは誤植かもしれませんが、_why_の説明は、動作を見せている価値があるIMOです。 – Madbreaks

+0

@ 4castleはい、あなたは正しくタイプミスがありますが、私はまだそれがnewArrをどのように変更するのか理解していませんか? – S1awek

0

次のようなものが動作するはずです。

function makeFriendlyDates (arr) { 

    // Splits each element of the array, and returns an array of results 
    var splitArr = arr.map(function (el) {return el.split('-');}); 

    // Prefer console.log to printing to HTML 
    // document.getElementById('result').innerHTML = splitArr; 
    console.log(splitArr); 

    var monthNames = ["January", "February", "March", "April", 
    "May", "June", "July", "August", "September", "October", 
    "November", "December" 
    ]; 

    // See http://stackoverflow.com/a/1643468/1327983 
    splitArr.forEach(function (el) { 
    var month = monthNames[ parseInt(el[1])-1 ]; 
    // What do you want to do with it from here? 
    el[1] = month; 
    }); 

    // Demonstrate results 
    console.log(splitArr); 
} 

makeFriendlyDates(['2016-07-01', '2016-08-04']); 
関連する問題