2017-05-05 8 views
0

dataのプロパティが入力に対応する項目が見つかるまで、埋め込み配列をループしています。jQueryで埋め込み配列のfind()を使用する。

以下の例は、オランダに警告する必要があります。代わりに、あなたがundefinedを取得し、2番目の配列から1つを選択するとオブジェクトを取得する場合、最初の配列の項目を使用するとき。

var countries = { 
 
    "EU": [ 
 
    {value: 'Malta', data: 'MT'}, 
 
    {value: 'Netherlands', data: 'NL'}, 
 
    {value: 'Austria', data: 'AT'}, 
 
    {value: 'Italy', data: 'IT'} 
 
    ], 
 
    "other": [ 
 
    {value: 'Bosnia and Herz.', data: 'BA'}, 
 
    {value: 'Jersey', data: 'JE'}, 
 
    {value: 'Belarus', data: 'BY'} 
 
    ] 
 
}; 
 

 

 
function findCountry(code) { 
 
    $.each(countries, function(key, arr) { 
 
    val = arr.find(function(obj) { 
 
     return obj.data == code; 
 
    }); 
 
    }); 
 
    return val; 
 
} 
 
    
 
alert(findCountry('NL'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

だから私は、アイテムが最初の配列で発見された場合でも、eachが稼働し続けると思います。おそらくreturn文が代わりに必要です。しかし、その後も、

var countries = { 
 
    "EU": [ 
 
    {value: 'Malta', data: 'MT'}, 
 
    {value: 'Netherlands', data: 'NL'}, 
 
    {value: 'Austria', data: 'AT'}, 
 
    {value: 'Italy', data: 'IT'} 
 
    ], 
 
    "other": [ 
 
    {value: 'Bosnia and Herz.', data: 'BA'}, 
 
    {value: 'Jersey', data: 'JE'}, 
 
    {value: 'Belarus', data: 'BY'} 
 
    ] 
 
}; 
 

 

 
function findCountry(code) { 
 
    $.each(countries, function(key, arr) { 
 
    return arr.find(function(obj) { 
 
     return obj.data == code; 
 
    }); 
 
    }); 
 
} 
 
    
 
alert(findCountry('BA'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

しかし、これはundefinedすべての時間を返します。それで私は何が欠けているのですか?

+0

問題は 'findCountryは()'あなたが構築する必要があります(「地域」ではなく)国を探している場合ので、それは – doublesharp

+0

undefined' 'で、ノーリターンを持っていないということです国名をキーとし、地域をサブオブジェクトの一部のプロパティとして持つオブジェクト。次に、オブジェクトのプロパティ全体を検索するのではなく、if(countries ['Malta'])をチェックしてください。 – James

+0

@James私は構造を変更することができたら残念ながら、私はこの特定の構造を必要とするプラグインを使用しています。 –

答えて

1

は、現在の助けを借りてそれを考え出した検索機能のいくつかのreturn文を忘れてしまったhttps://jsfiddle.net/yybgn2jg/1/

+0

jQueryを使わずにこれを行うことができます。私の答えをチェックしてください。 – doublesharp

2

$.each()の結果をfindCountry()関数内に返す必要があります。あなたの例ではreturnがないので、undefinedです。何も割り当てていないので、var valも削除しました。ちょうどあなたが純粋なJavascriptを使用して(何のjQueryのは必要ありません)、あなたが見つけたときに早期に終了することを目的と​​方法をループにObject.keys()方法を使用することによって、それが効率的に行うことができます一致する国の名前を返すために

function findCountry(code) { 
    return $.each(countries, function(key, arr) { 
    return arr.find(function(obj) { 
     return obj.data == code; 
    }); 
    }); 
} 

試合。

var countries = { 
    "EU": [ 
    {value: 'Malta', data: 'MT'}, 
    {value: 'Netherlands', data: 'NL'}, 
    {value: 'Austria', data: 'AT'}, 
    {value: 'Italy', data: 'IT'} 
    ], 
    "other": [ 
    {value: 'Bosnia and Herz.', data: 'BA'}, 
    {value: 'Jersey', data: 'JE'}, 
    {value: 'Belarus', data: 'BY'} 
    ] 
}; 

function findCountry(code) { 
    var name = null; 
    Object.keys(countries).some(function(key) {  // Go through EU, other, ... 
    return countries[key].some(function(country) { // Check the array under each key 
     if (country.data === code) {    // check the code against the data value 
      name = country.value;     // set the name to the value 
     } 
     return name !== null;      // a true result will exit some() 
    }); 
    });            // this some() will also exit when we get a result 
    return name;          // return the name value we found 
} 

console.log(findCountry('BA')); 

あなただけ

var countries = { 
 
    "EU": [ 
 
    {value: 'Malta', data: 'MT'}, 
 
    {value: 'Netherlands', data: 'NL'}, 
 
    {value: 'Austria', data: 'AT'}, 
 
    {value: 'Italy', data: 'IT'} 
 
    ], 
 
    "other": [ 
 
    {value: 'Bosnia and Herz.', data: 'BA'}, 
 
    {value: 'Jersey', data: 'JE'}, 
 
    {value: 'Belarus', data: 'BY'} 
 
    ] 
 
}; 
 

 

 
function findCountry(code) { 
 
    var result; 
 

 
    $.each(countries, function(key, arr) { 
 
    var countryRes = arr.find(function(obj) { 
 
     return obj.data == code; 
 
    }); 
 
    if (countryRes) { 
 
     result = countryRes; 
 
    } 
 
     
 
    }); 
 

 
    return result && result.value; 
 
} 
 
    
 
alert(findCountry('JE'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

ES6 Lambdaはこれを1行に減らすことができます:D –

+0

技術的には、すべて1行で書くこともできます:P – doublesharp

+0

'return $ .each(countries、(key、arr)=> arr.find(obj => obj。 data == code)); –

-1

ここに見られるように、この意志出力Bosnia and Herz.回答といくつかのより多くの実験。

var countries = { 
 
    "EU": [ 
 
    {value: 'Malta', data: 'MT'}, 
 
    {value: 'Netherlands', data: 'NL'}, 
 
    {value: 'Austria', data: 'AT'}, 
 
    {value: 'Italy', data: 'IT'} 
 
    ], 
 
    "other": [ 
 
    {value: 'Bosnia and Herz.', data: 'BA'}, 
 
    {value: 'Jersey', data: 'JE'}, 
 
    {value: 'Belarus', data: 'BY'} 
 
    ] 
 
}; 
 

 

 
function findCountry(code) { 
 
    var val; 
 
    $.each(countries, function(key, arr) { 
 
    val = arr.find(function(obj) { 
 
     return obj.data == code; 
 
    }); 
 
    // If value is found, exit early 
 
    if (val) return false; 
 
    }); 
 
    
 
    // If value found, return it, else return undefined 
 
    return val ? val.value : undefined; 
 
} 
 
    
 
console.log(findCountry('MP'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

最初の配列から項目を選択しても機能しません。 –

+0

私はそれを修正しました。 – jony89

関連する問題