2016-12-11 17 views
0

dご挨拶、おめでとうStackOverflowコミュニティ!私の質問は簡単なものだと思われますが、私が間違っているところではそれを得られません。JSON検索ループは最初のヒット後に停止します

そうなことは、私は、次のデータをJSONを持って、次のとおりです。

var data = [{ 
    "id": 0, 
    "friends": ["Mike", "John"], 
    "enemies": ["Albert", "Amy"], 
    "image": "https://link.com/1" 
}, { 
    "id": 1, 
    "friends": ["Chad", "John"], 
    "enemies": ["Lawrence", "Amy"], 
    "image": "https://link.com/2" 
}, { 
    "id": 2, 
    "friends": ["Craig", "John"], 
    "enemies": ["Adam", "Amy"], 
    "image": "https://link.com/3" 
}, { 
    "id": 3, 
    "friends": ["Craig", "Bruce"], 
    "enemies": ["Adam", "Scott"], 
    "image": "https://link.com/4" 
}]; 

は、今私は、ユーザの入力を使用してこのデータをループしようとしています。たとえば、ユーザーが「Adam」と入力した場合、敵の配列に貧弱なAdamが表示されているオブジェクトのIDを取得したいと考えています。

function getObjectByEnemyName(name){ 
    for (var i = 0; i < data.length; i++) {    // In each object of the data array 
    for (var m = 0; m < data[i].enemies.length; m++) { // Locate the enemies array and search through each of its elements 
     if (data[i].enemies[m] == name) {    // If the m'th element of the enemies array in the i'th object of the data array equals to the entered string 
     return data[i].id         // Return the id value of the data array's i'th object 
     } 
    } 
    } 
} 


var found = getObjectByEnemyName("Adam"); 

彼は一度だけenemies配列に提示されているので、私は、例えば、「アルバート」のために、探していた場合、完全に正常に動作します:

は、これまでのところ私は、次のコードを思い付いています。

しかし、 "Adam"のようなクエリの場合、私の関数はデータ配列の3番目のオブジェクト(id = 2)で最初に正しいヒットを見つけ、出力を続けることを拒否し、2、実際にそこに次のオブジェクト内の別の「アダム」であり、私は結果がこのような何かになりたいとき:この種の動作を達成するために

['2', '3'] 

、私は関数の内部よりforwhileループを挿入してみました使用していますが、悲惨に失敗しました。私はまた、いくつかのサードパーティのノードパッケージを使ってデータアレイを検索しようとしましたが、成功しませんでした。

私のループには、他のマッチを探し続け、最初の正しいヒットで停止しないように指示する方法がありますか?どんな助けもありがとう。

P .: JSONデータの表示を制御しているので、問題が隠れている場合は簡単に変更できます。ちょっと教えてください。

大変ありがとうございます。 idに続い

+0

使用を:

function getObjectByEnemyName(name) { var results = []; for (var i = 0; i < data.length; i++) { // In each object of the data array for (var m = 0; m < data[i].enemies.length; m++) { // Locate the enemies array and search through each of its elements if (data[i].enemies[m] == name) { // If the m'th element of the enemies array in the i'th object of the data array equals to the entered string results.push(data[i].id); // Return the id value of the data array's i'th object } } } return results; } 

を次のようにところで、あなたの検索を簡素化することができます'Array.prototype.filter()' – Redu

+0

あなたの究極の問題は、一度マッチするとあなたが戻ってくることです。代わりに見つけた値を保存するか、上記の 'filter'のようなものを使う必要があります。 – Iluvatar

+0

@Iluvatar @Reduあなたのアドバイスありがとうございました!今のところ値を保存するのをやめようと思っています。なぜなら、それは私の方が使い慣れているからですが、正しく使用する方法を学ぶ際には、必ず 'filter'メソッドを使うことを検討します。 – Monochrome

答えて

1

実際に最初の試合に戻ってくるので、最初の試合で停止しています...

あなたがmuliple試合をしたい場合は、配列に格納することができ、検索が終了した後、全体の配列を返す:

function getObjectsByEnemyName(name) { 
    return data.filter(item => item.enemies.includes(name)).map(item => item.id); 
} 
+0

あなたの助けを大変ありがとう、Matías、今私は間違いを理解していました。 – Monochrome

+0

@monochrome問題はありません、よろしくお願いします! –

0

使用Array#filterあなたは(この場合の 'アダム')検索敵を持っているアイテムを取得するために、Array#mapそれらは:

var data = [{"id": 0,"friends": ["Mike", "John"],"enemies": ["Albert", "Amy"],"image": "https://link.com/1"}, {"id": 1,"friends": ["Chad", "John"],"enemies": ["Lawrence", "Amy"],"image": "https://link.com/2"}, {"id": 2,"friends": ["Craig", "John"],"enemies": ["Adam", "Amy"],"image": "https://link.com/3"}, {"id": 3,"friends": ["Craig", "Bruce"],"enemies": ["Adam", "Scott"],"image": "https://link.com/4"}] 
 

 
var search = "Adam"; 
 

 
var result = data.filter(function(item) { 
 
    return item.enemies.indexOf(search) !== -1; 
 
}).map(function(item) { 
 
    return item.id; 
 
}); 
 

 
console.log(result);

あなたもそれを行うことができます

var data = [{"id": 0,"friends": ["Mike", "John"],"enemies": ["Albert", "Amy"],"image": "https://link.com/1"}, {"id": 1,"friends": ["Chad", "John"],"enemies": ["Lawrence", "Amy"],"image": "https://link.com/2"}, {"id": 2,"friends": ["Craig", "John"],"enemies": ["Adam", "Amy"],"image": "https://link.com/3"}, {"id": 3,"friends": ["Craig", "Bruce"],"enemies": ["Adam", "Scott"],"image": "https://link.com/4"}] 
 

 
var search = "Adam"; 
 

 
var result = data.reduce(function(arr, item) { 
 
    item.enemies.indexOf(search) === -1 || arr.push(item.id); 
 
    
 
    return arr; 
 
}, []); 
 

 
console.log(result);
Array#reduceを使用して1回のパスで

+0

ありがとう、あなたの努力のためにありがとう、オリ、自分のコードが何度も失敗した後に行動を起こすのを楽しみにしていました。あなたのアドバイスを読むのは本当に面白かったです。私はプログラミングには新しく、Array#reduceについて聞いたこともありません。後でそれを必ず探検するでしょう。再度、感謝します! – Monochrome

+0

ようこそ。あなたの研究に幸運。 –

関連する問題