2017-05-05 42 views
0

我試圖循環嵌入式數組,直到找到一個項的data屬性對應於我的輸入。在jQuery上使用嵌入式數組的find()。每個

下面的示例應該提示荷蘭。相反,當你在第一個數組中使用一個項目時,你會得到undefined,如果你從第二個數組中選擇一個,你會得到一個對象。

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保持運行。可能需要返回語句。但即便如此,

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()'沒有回報,因此它被'undefined' – doublesharp

+0

如果您正在查找的國家(而不是「區」),你應該構建您的對象的國家名稱作爲關鍵字,而區域作爲子對象的某些屬性。然後,只需檢查'if(countries ['Malta'])'而不是搜索整個對象的屬性。 – James

+0

@詹姆斯我希望我可以改變結構,不幸的是我正在使用一個需要這個特定結構的插件。 –

回答

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

你也可以不使用jQuery來做這件事,查看我的答案。 – doublesharp

2

您需要返回findCountry()函數中的$.each()的結果。在您的示例中沒有return,因此undefined。我也刪除了var val,因爲你沒有分配任何東西。

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

爲剛剛回歸,您可以使用純JavaScript(無jQuery的需要),並使其有效使用Object.keys()方法來遍歷對象和​​方法,當你發現提前退出匹配的國名一場比賽。

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')); 

這裏看到https://jsfiddle.net/yybgn2jg/1/

+0

ES6 Lambdas可以將其減少到一行:D –

+0

從技術上講,我可以在一行中寫出全部內容:P – doublesharp

+0

'return $ .each(countries,(key,arr)=> arr.find(obj => obj。數據==代碼));' –

-1

你忘記了查找功能的一些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) { 
 
    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

從第一個陣列中選擇一個項目時不起作用。 –

+0

好吧,我已經修復了.. – jony89

相關問題