2016-09-09 4 views
0

私はこのコードを使用して、オブジェクトから数時間を取得し、それらを変数で掛けます。ここでjavascript-特定のプロパティとしてオブジェクトがあるかどうかを確認する方法

は、私はプロパティ「時間」が仕事中に存在するかどうかを確認するために、「hasOwnPropertyを」を使用している有料

function calculatePay() 
{ 
    var result = 0, fResult = 0; 

    for(var i = 0; i < work.length; i++) { 
     Object.keys(work).forEach(function (val) { 
      if (work[i].hasOwnProperty('hours')) 
       result = work[i][val] * payPerHour; 

      fResult += result; 
     }); 
    } 

    return fResult; 
} 

を計算するためのオブジェクトの仕事 "

var work = [ 
    {'day': 27, 'hours': 7.30}, 
    {'day': 29, 'hours': 7.30}, 
    {'day': 31, 'hours': 10}, 
    {'day': 1, 'hours': 8.30}, 
    {'day': 2, 'hours': 7}, 
    {'day': 3, 'hours': 7}, 
    {'day': 5, 'hours': 7.30}, 
    {'day': 6, 'hours': 7}, 
    {'day': 7, 'hours': 7.30}, 
    {'day': 8, 'hours': 8}, 
    {'day': 9, 'hours': 9.30} 
] 

var payPerHour = 7; 

とここで私の関数であります。関数の結果はNaNです。どうして?

+2

'Object.keys(仕事)':あなたはここで何を期待していますか? –

+0

彼はループのために私は配列を繰り返し、次にObject.keys(work)を使って配列にあるオブジェクトを調べます。 –

+0

@DavidDume - オブジェクトを繰り返し処理する必要はありません。 – tymeJV

答えて

4

あなたは既にforループを介して、あなたの配列を反復処理している - あなたは

Object.keys(work).forEach(function(val) { 

これはどんな意味がありませんありません。 workは配列であり、オブジェクトではありません。あなたがその行を削除し、基本的にあれば、それは動作します:

function calculatePay() { 
 
    var result = 0, fResult = 0; 
 
    for(var index in work) { 
 
     \t \t if(work[index].hasOwnProperty('hours')) 
 
\t \t \t result = work[index]['hours'] * payPerHour; 
 
\t \t \t fResult += result; 
 
    } 
 
    return fResult; 
 
}

for(var i = 0; i < work.length; i++) { 
    //Object.keys(work).forEach(function(val) { 
    if(work[i].hasOwnProperty('hours')) 
     result = work[i]["hours"] * payPerHour; //use the right property here 

    fResult += result; 
    //}); 
} 

簡単な方法は、あなたが以下のようにfor..inループJavascriptを使用することができますArray.reduce

var totalHourPay = work.reduce(function(total, workDay) { 
    if (workDay.hasOwnProperty("hours")) { 
     total += workDay.hours * payPerHour; 
    } 

    return total; 
}, 0); 
+0

または単純に 'work.reduce((total、workDay)=>合計+(workDay.hours || 0)* payPerHour、0)'です。 –

+0

@ScottSauyet - Ya - ES6構文が利用可能な場合:D – tymeJV

+0

確かに、ES6は素敵な変更ですが、 'hasOwnProperty'チェックを削除して' || 0 "はそれをより簡潔にし、私の目には読みやすくします。 –

0

を使用することであってもよいです

0

なぜこれらの複雑なex報道?このES6ソリューション試してみてください。

var work = [{'day':27,'hours':7.30},{'day':29,'hours':7.30},{'day':31,'hours':10}, 
 
      {'day':1,'hours':8.30},{'day':2,'hours':7},{'day':3,'hours':7}, 
 
      {'day':5,'hours':7.30},{'day':6,'hours':7},{'day':7,'hours':7.30}, 
 
      {'day':8,'hours':8},{'day': 9, 'hours': 9.30}], 
 
      calculatePay=(b)=>work.reduce((c,d)=>c+d.hours*b,0) 
 

 
// Test 
 
console.log(calculatePay(7)) // Returns 600.6 and 7 is your rate per hour 
 

 
// Or redefine function calculatePay this way if you need ES5 compatibility 
 
// function calculatePay(a) { 
 
// return work.reduce(function(b,c) { 
 
//  return b + c.hours * a 
 
// }, 0) 
 
// } 
 

 
// And if you really needs use hasOwnProperty, define it this way 
 
// function calculatePay(a) { 
 
// return work.reduce(function(b,c) { 
 
//  return b + (c.hasOwnProperty('hours') && c.hours || 0) * a 
 
// }, 0) 
 
// } 
 

 
// But you dont need hasOwnProperty. You are processing simple array, 
 
// not object. And this array is full of ordinary object literals. None of 
 
// them does not inherits anything from another object, unless you override 
 
// Object itself.

0

を私はこれがあなたが望んでいると信じて:

var work = [{'day': 27, 'hours': 7.30}, 
     {'day': 29, 'hours': 7.30}, 
     {'day': 31, 'hours': 10}, 
     {'day': 1, 'hours': 8.30}, 
     {'day': 2, 'hours': 7}, 
     {'day': 3, 'hours': 7}, 
     {'day': 5, 'hours': 7.30}, 
     {'day': 6, 'hours': 7}, 
     {'day': 7, 'hours': 7.30}, 
     {'day': 8, 'hours': 8}, 
     {'day': 9, 'hours': 9.30} 
     ]; 

var payPerHour = 7; 

var result = 0, fResult = 0; 

function calculatePay(){ 

for(var i = 0; i < work.length; i++) { 
    Object.keys(work).forEach(function() { 

    result = work[i].hours * payPerHour; 
    fResult += result; 
}); 

} 

console.log("Final total: " +fResult); 
} 

calculatePay(); 
関連する問題