2017-08-10 9 views
-3

奇数にバグを見つけるなぜCannot read property 'odd' of undefinedと、このコードのエラー:私が思っていた

var numbers = [5, 3, 8, 6, 9, 1, 0, 2, 2]; 

let isOdd = function(number){ 
    return number % 2 !== 0; 
} 

var oddEvenCounts = numbers.reduce(function(counts, number) { 
    let odd; 
    let even; 

    if (isOdd(number)) { 
     counts[odd] = counts['odd'] + 1; 
    } else { 
     counts[even] = counts['even'] + 1; 
    } 
}, {}); 

console.log(oddEvenCoutns(numbers)); 

// expected result 
// counts = { 
// odd: 1, 
// even: 3 
// } 

エラーがどこにあると思いますか?それは基本的に[さえ]

+0

'counts'は –

+0

は、私はそれが削減に合格しなかった定義されていないステップ・バイ・ステップのMapReduce? (関数(counts、number)??? –

+0

) 'odd'は何も設定されていません。コードもフォーマットしてください。コードを書式設定しないと何が起こっているのかを理解することは非常に難しいです。 –

答えて

0

これを試してみてください、あなたがオッズの数をカウントするために探している場合はカウント

var numbers = [5, 3, 8, 6, 9, 1, 0, 2, 2]; 
function isOddNumber(number){ 
    return number % 2 !== 0; 
} 

var oddEvenCounts = numbers.reduce(function(counts, number) { 
    let odd; 
    let even; 
    if(isOddNumber()){ 
     console.log(number) 
     counts['odd'] = number + 1; 
    } else { 
    counts['even'] = number + 1; 
    } 
    return counts; 
}, {}); 
console.log(oddEvenCounts); // this is not a function it holds the value from reduce 
+0

私はちょうど尋ねられた質問のこの部分を解決しようとしました - 私はこれがなぜ続くのか不思議でした未定義のプロパティ '奇数'を読むことができません。とにかくお返事 –

+0

あなたが助けの部分を理解していない場合、下の票を続けてください - 私はこれがなぜ続けますか不思議に思っていました。 –

+0

しかし....それはうまくいかない答えですか?あなたは 'counts ['odd'] = number + 1'に変更しました。これはまったく意味がなく、まったく間違っています。 – adeneo

2

を返す必要がカウント[奇数]とカウントを指し、その後、あなたのリストnumbersに追いつきました私はあなたの意図を誤解しているか、期待される結果が間違っています。

// expected result 
// counts = { 
// odd: 1, 
// even: 3 
// } 

あなたの配列に9個の数字がある場合は意味がありません。しかし、私はこの問題がmapreduceの問題として最も適していると思います。同じ関数(isOdd)を配列のすべての要素に適用(マッピング)してから、それを1つのオブジェクトに縮小します。

let numbers = [5, 3, 8, 6, 9, 1, 0, 2, 2]; 

// good job, this looks fine! +1 strict equality operator 
const isOdd = function(number) { 
    return number % 2 !== 0; 
} 

// function to keep track of your odd and evens 
const sumEvenOdd = function(acc, cur) { 
    if (true == cur) { 
     acc['odd'] += 1; 
    } else { 
     acc['even'] += 1; 
    } 
    return acc; // make sure you return your resulting object so it doesn't lose scope! 
} 

let foo = numbers.map(el => isOdd(el)) // determine even or odd 
       .reduce(sumEvenOdd, {'even': 0,'odd': 0}); // sum even and odd! 
console.log(foo); // {'even': 5, 'odd': 4} 
0

let numbers = [5, 3, 8, 6, 9, 1, 0, 2, 2]; 

function is_odd(number) { return number % 2 !== 0; } 

function get_counts(numbers) { 
    numbers = numbers.map(is_odd);           // map is_odd over xs -> [true, true, false, false, true, true, false, false, false] 
    let odd_sum = numbers.reduce(function(sum, n) { return sum + n; }, 0); // reduce sum of true values -> 4 

    return { 'odd': odd_sum, 'even': numbers.length - odd_sum } 
} 

console.log(get_counts(numbers)); 
関連する問題