2016-06-30 19 views
0

私はWebアプリケーション用のmockDataを使用しています。ネストされたオブジェクトをループするようにしています。私の問題は、forループは動作しますが、array.mapではなく、なぜか分からないということです。ここでJavascriptループ:forループは動作しますが、マップは動作しませんか?

は、ループのためである:私は特定のロードしようとしている

fakeChartData = [ 
    { 
    id: '232fsd23rw3sdf23r', 
    title: 'blabla', 
    poll: [{}, {}] 
    }, 
    { 
    id: '23dgsdfg3433sdf23r', 
    title: 'againBla', 
    poll: [{}, {}] 
    } 
]; 

fakeChartData.map(data => { 
    data.poll.map(data => { 
     if (data.id === id) { 
     return data; 
     } 
    }); 
    }); 

マイデータ構造:

for (let i = 0; i < fakeChartData.length; i++) { 
    for (let j = 0; j < fakeChartData[i].poll.length; j++) { 
     if (fakeChartData[i].poll[j].id === id) { 
     return fakeChartData[i].poll[j] 
     } 
    } 
    } 

そしてここでは、マップのループでありますonClickメソッドで渡されたIDを持つオブジェクト。ここ は、フル機能である:

export const fetchPollOptById = (id) => 
    delay(500).then(() => { 
    for (let i = 0; i < fakeChartData.length; i++) { 
     for (let j = 0; j < fakeChartData[i].poll.length; j++) { 
     if (fakeChartData[i].poll[j].id === id) { 
      return fakeChartData[i].poll[j] 
     } 
     } 
    } 
}); 
+0

あなたはデータ構造の例を提供する必要があります。 – Hitmands

+0

これはどのように実行されますか?私たちのテストではarray.mapの使用に問題があります。それらはjasmineとphantom.jsを使用して実行されます。 Phantom.jsがarray.mapをサポートしていないようです – mortb

+1

'map'内の' return'文が何を返すのかを考えてみましょう。 –

答えて

2

をサポートする必要があるブラウザものに依存している場合やろうとして再」、これは動作するはずです:

return fakeChartData.reduce((acc, data) => acc.concat(data.poll), []) 
        .filter(pollObj => pollObj.id === id)[0] 

最初に、それはすべての投票を含む配列を作る異なるデータオブジェクトからオブジェクトを、それが正しいIDとRETを持つものを見つけるために、それらをフィルタリングしますそのオブジェクトを返す。

mapを使用してあなたのアプローチがうまくいかない理由として、間違った方法で使用しています。 mapは何をして、配列のすべてのメンバーに関数を適用します。

は、ここで配列だとあなたのような種類の機能:これは動作しません

const arr = [1,2,3] 
const getThingById(id) => { 
    var mappedArray = arr.map(x => { 
    if(x === id) return x 
    }) 
    console.log(mappedArray) // [3] 
} 
getThingById(3) // undefined 

getThingByIdにはreturn文がありません。 return文return xはに渡された関数から何かを返すです。基本的には、あなたがしようとしていることを行うにはmapを使用すべきではありません。 mapは、配列を返す場合に使用します。

+0

これは動作しますが、私はなぜ.map()が動作していないのか探していました。私は既に、for-loopで動作する例を得ました。 – Khpalwalk

+0

returnステートメントが2番目のコールバックを終了するだけなので、マップの例は機能しません。どちらのコールバックも配列全体を繰り返し処理します。あなたのサンプルから結果として得られる配列は、未定義のみを含みます。 [地図](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) –

+0

@ R.Schmitt説明をありがとう。他の人たちは、「理由」については何の答えもなかった。お返事ありがとうございます。 – Khpalwalk

1

は、それが動作するはずです。この

fakeChartData.map(data => { 
    var result = data.poll.map(data => { 
     if (data.id === id) { 
     return data; 
     } 
    }); 
    return result; 
    }); 

を試してみてください。そして、ええmap()の代わりにfind()を使用する必要があります。

+0

.findはIEによってサポートされていません – mortb

+0

@Shubham Khatri動作しませんでした。 – Khpalwalk

+0

マップをfind()に置き換えようとしました –

1

ビット長の実装:

let results = fakeChartData.map(data => { 
    let innerResult = data.poll.filter(data => { 
     if (data.id === id) { 
     return data; 
     } 
    return innerResult.length ? innerResult[0] : null; 
    }); 
    }) 
    .filter(x => (x !== null)); 
let whatYouwant = results.lenght ? results[0] : null; 

あなたはそれがよりよいなります)(見つける使用することができますが、それは私があなたのものについて権利だ場合は、

3

forループ内のreturn文は、関数を返します。ただし、.map()関数のコールバック内のreturn文はコールバックを返すのみで、この戻り値は新しい配列に配置されます。 documentationをご覧ください。本当に使用したい場合は。

export const fetchPollOptById = (id) => { 
    var result; 
    fakeChartData.map(data => { 
     data.poll.map(data => { 
      if (data.id === id) { 
       result = data; 
       return data; 
      } 
     }); 
    }); 
    return result; 
} 

注:私もあなたのポーリングオブジェクトは、このようなidフィールドを持っていることを前提としています

fakeChartData = [ 
     { 
      id: '232fsd23rw3sdf23r', 
      title: 'blabla', 
      poll: [ 
       {id: 'pollId1', otherField: 'blah'}, 
       {id: 'pollId2', otherField: 'blah'} 
      ] 
     }, 
     { 
      id: '23dgsdfg3433sdf23r', 
      title: 'againBla', 
      poll: [ 
       {id: 'pollId3', otherField: 'blah'}, 
       {id: 'pollId4', otherField: 'blah'} 
      ] 
     } 
    ]; 

あなたは、このような世論調査のデータを取得することができますマップ()、あなたはこのようにそれを行うことができます:

fetchPollOptById("pollId3"); //returns {id: "pollId3", otherField: "blah"} 
+0

今私はそれを得たが、とにかく感謝。しかし、あなたの答えは私が望むものに近いですが、私はすでに他の人の答えを受け入れていますが、私がもう一度それをやることができれば、あなたの答えになります。 乾杯 – Khpalwalk

+0

あなたは質問の作成者として受け入れられた回答を変更することができますが、私の回答があなたに役立つ場合にのみそれを行います。 http:// metaを参照してください。stackexchange.com/questions/93969/is-changing-the-accepted-answer-frowned-upon –

関連する問題