[英]Loop through array of arrays to find a countrys neighbors
我的JavaScript具有以下結構:
var map_neighbour_regions = [{
"id": 1,
"name": "Alaska",
"dom_element": "Alaska",
"continent_id": 1,
"neighbours": [{
"id": 1,
"region_id": 1,
"neighbour_region_id": 59
}, {
"id": 2,
"region_id": 1,
"neighbour_region_id": 64
}]
}, {
"id": 2,
"name": "Algeria",
"dom_element": "Algeria",
"continent_id": 1,
"neighbours": [{
"id": 3,
"region_id": 2,
"neighbour_region_id": 10
}, {
"id": 4,
"region_id": 2,
"neighbour_region_id": 19
}, {
"id": 5,
"region_id": 2,
"neighbour_region_id": 47
}, {
"id": 6,
"region_id": 2,
"neighbour_region_id": 52
}],
.....
}
在一個循環中,我想找到一個給定的國家,然后訪問每個鄰國。 我無法使它正常工作。
我從一個國家名稱開始,我想在第一個國家的列表中找到它,然后為每個鄰居ID從第一個列表中再次獲得該名稱。
我想以(例如)一個區域名稱數組作為結尾,這些區域名稱是輸入國家/地區名稱的鄰居。 對於阿根廷這樣的輸入國家,我想輸出:
neighbour_regions = {'chile', 'brazil', 'bolivia'};
我嘗試訪問第一級沒有成功(未定義):
function highlightNeighbouringRegions(country) {
console.log(map_neighbour_regions [0][country]);
console.log(map_neighbour_regions [0].country);
console.log(map_neighbour_regions [country]);
};
我喜歡動態解決方案。
這是一個遞歸函數,它需要:
prop
名稱(“示例name
”) desiredValue
值(“您的示例中為Argentina
”) 因此:
function findNode(prop, desiredValue, jsonObj)
{
if (!jsonObj || "object" !== typeof jsonObj) { return; }
if (jsonObj[prop] === desiredValue) { return jsonObj; }
for (var x in jsonObj)
{
if (Object.hasOwnProperty.call(jsonObj, x))
{
var result = findNode(prop, desiredValue, jsonObj[x]);
if (result !== undefined) { return result; }
}
}
}
現在您可以:
var a=findNode("name","Argentina",map_region_neighbours);
console.table(a.neighbours); //check for undefined etc...
結果:
http://jsfiddle.net/5tfnxwkw/2/
編輯:
在您發表評論后,我增強了功能。
現在該函數需要Assertion
斷言將檢查條件/屬性是否存在。
例如 :
{
"id": 4,
"name": "Argentina",
"dom_element": "Argentina",
"continent_id": 1,
"neighbours": [{
"id": 9,
"region_id": 4,
"neighbour_region_id": 8
}
...
讓我們看一下id
: 我指的是哪個ID ? 內部還是外部?
所以現在該方法看起來像:
function findNode(prop, desiredValue, jsonObj,assertion)
所以現在如果我提供:
findNode("id", ..., ...,'dom_element')
還將搜索名為dom_element
的兄弟姐妹
因此,它將匹配"id": 4,
因此,如果您的名字叫John並且您有一個叫Paul的兄弟,並且您還有一個叫John的兒子,有一個叫Ringo的兄弟,那么如果我想推薦您-這里的訣竅是搜索帶有“ Paul”的“ John”兄弟姐妹。 (而不是鈴聲)
好的,但是如果我想要內部ID怎么辦? "id": 9,
然后-您將調用類似的方法:
findNode("id", ..., ...,'region_id')
因此,您實際上可以幫助該方法確定選擇哪個節點。
好,那么最終代碼將如何顯示?
var n=findNode("name","Alaska",map_region_neighbours,'name').neighbours;
n.forEach(function logArrayElements(element, index, array) {
console.log("******neighboors id "+(element["id"])+" has a name of : ");
console.log( findNode("id", element["id"], map_region_neighbours,'dom_element').name);
})
結果 :
******neighboors id 1 has a name of :
Alaska
******neighboors id 2 has a name of :
Algeria
新的jsbin: http : //jsfiddle.net/5tfnxwkw/3/
以下代碼將在控制台中向您顯示國家/地區名稱的所有鄰居,您已將它們作為變量傳遞給函數highlightNeighbouringRegions
:
function highlightNeighbouringRegions(country) {
var result = [];
$.each(map_neighbour_regions, function(idx1, e1) {
if (e1.name === country) {
var neighbour_regions = [];
$.each(e1.neighbours, function(idx2, e2) {
neighbour_regions.push(e2.neighbour_region_id);
});
$.each(map_neighbour_regions, function(idx3, e3) {
if ($.inArray(e3.id, neighbour_regions) > -1) {
result.push(e3.name);
}
});
}
});
return result;
}
var neighbour_regions = highlightNeighbouringRegions('Alaska');
console.log(neighbour_regions);
此代碼將返回您所需的數據-在neighbour_regions
您將擁有一個包含所有鄰居國家/地區名稱的數組。
我想以(例如)一個區域名稱數組作為結尾,這些區域名稱是輸入國家/地區名稱的鄰居。 對於阿根廷這樣的輸入國家,我想輸出:
neighbour_regions = {'chile', 'brazil', 'bolivia'};
這是另一種方式:
function getNeighbors(search) {
var found = regions.filter(function(s) { // filter regions for search term
return s.name == search;
})[0].neighbours.map(function(n) { // create array of ids from found items
return n.id;
});
// create and return an array of name from regions where id matches
return regions.reduce(function(result, r) {
if (found.indexOf(r.id) > -1) result.push(r.name);
return result;
}, []);
}
以getNeighbors('Alaska')
調用此函數將獲得一個鄰居名稱數組["Algeria", "Antartica"]
。
演示小提琴 : http : //jsfiddle.net/abhitalks/zpgfjuc0/
演示片段 :
var regions = [{ "id": 1, "name": "Alaska", "dom_element": "Alaska", "continent_id": 1, "neighbours": [{ "id": 2, "region_id": 1, "neighbour_region_id": 59 }, { "id": 3, "region_id": 1, "neighbour_region_id": 64 }] }, { "id": 2, "name": "Algeria", "dom_element": "Algeria", "continent_id": 1, "neighbours": [{ "id": 1, "region_id": 2, "neighbour_region_id": 10 }, { "id": 4, "region_id": 2, "neighbour_region_id": 19 }] }, { "id": 3, "name": "Antartica", "dom_element": "AntarticWildlifeTerritory", "continent_id": 1, "neighbours": [{ "id": 1, "region_id": 3, "neighbour_region_id": 5 }, { "id": 8, "region_id": 3, "neighbour_region_id": 49 }] }, { "id": 4, "name": "Argentina", "dom_element": "Argentina", "continent_id": 1, "neighbours": [{ "id": 2, "region_id": 4, "neighbour_region_id": 8 }, { "id": 10, "region_id": 4, "neighbour_region_id": 9 }, { "id": 11, "region_id": 4, "neighbour_region_id": 12 }, { "id": 12, "region_id": 4, "neighbour_region_id": 50 }] }]; function getNeighbors(country) { var found = regions.filter(function(c) { return c.name == country; })[0].neighbours.map(function(n) { return n.id; }); return regions.reduce(function(result, r) { if (found.indexOf(r.id) > -1) result.push(r.name); return result; }, []); } snippet.log(getNeighbors('Alaska')); snippet.log(getNeighbors('Algeria')); snippet.log(getNeighbors('Argentina'));
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.