2016-09-27 40 views
0

所以我查看了包括Finding All Combinations of JavaScript array valueshttps://codereview.stackexchange.com/questions/52119/calculate-all-possible-combinations-of-an-array-of-arrays-or-strings在內的多個數據源,並且仍然出現空白。在不改變原始數組的情況下迭代多維數組

我將字符串「35 w 35 ave」拆分爲" "的數組,然後將其與數組進行比較。這裏是對象:

var addressObject = { 
    ave : ["av", "aven", "avenu", "avenue", "avn", "avnue"], 
    w : ["west", "wst", "w"] 
}; 

我添加這var address = txtNode.val().split(' ');它返回陣列['35','w','35','ave'],然後我走陣列和把它通過一個嵌套forEach循環像這樣:

address.forEach(function(addressElement, indexOfAddressElement) { 
    var abbreviationMatch = addressObject.hasOwnProperty(addressElement); 
    if (abbreviationMatch) { 
     function addSentenceVariationsToAddressLists(arrayToLookAt) { 
      arrayToLookAt.forEach(function (anItem, a) { 
       var y = address.splice(indexOfAddressElement, 1, anItem); 
       addressLists.push(address.join(" ")); 
      }) 
     } 
     var elementsFromArray = addressObject[addressElement]; 
     addSentenceVariationsToAddressLists(elementsFromArray); 
    }  
}); 
console.log(addressLists); 

這返回["35 west 35 ave", "35 wst 35 ave", "35 w 35 ave", "35 w 35 av", "35 w 35 aven", "35 w 35 avenu", "35 w 35 avenue", "35 w 35 avn", "35 w 35 avnue"]

我的問題是:如何將"ave"的所有變體與"wst""west"而不是僅包含原始值的"w" e的address數組?

+0

你爲什麼有' 「W」'在'addressObject'的'在首位w'財產。 – Redu

+0

因爲當我把它拿出來的時候,它並沒有顯示在地址列表中,它只顯示「[35 35 west 35 ave」,「35 th 35 35 ave」,「35 th 35 35 av」,「35 th 35 35 aven」 ,「35歲35歲」,「35歲35歲」,「35歲35歲」,「35歲35歲」 –

回答

0

好的,所以這花了一些時間弄清楚,因爲我試圖調整你的代碼,而不是完全重構。不幸的是,我認爲這個代碼在底層結構方面是有缺陷的,所以我最終不得不進行一些改變,以最佳的重用功能按預期工作。

請注意,此代碼不會考慮其他街道變化(街道,地點,駕駛等)以及其他方向(東,北,南)。它也沒有考慮到雙重街道名稱。例如,「25W西大街」將用變體替代「西」,而不是W。這將成爲一個問題,如果/當你添加其他街道/方向的變化,因爲有像「123西大街」或「123西北大街」等街道。

讓我知道這是如何工作的爲你,如果你有任何問題!

var addressObject = { 
 
    streets: ["av", "aven", "avenu", "avenue", "avn", "avnue", "ave"], 
 
    directions: ["west", "wst", "w"] 
 
}; 
 
var adr = "35 w 35 ave"; 
 

 
function addSentenceVariationsToAddressLists(address, indexes) { 
 
    var addresses = []; 
 
    addressObject.streets.forEach(function(street) { 
 
    addressObject.directions.forEach(function(direction) { 
 
     var y = address.slice(); 
 
     y[indexes.streetIndex] = street; 
 
     y[indexes.directionIndex] = direction; 
 
     addresses.push(y.join(" ")); 
 
    }); 
 
    }); 
 
    return addresses; 
 
} 
 

 
function getAddressLists(address) { 
 
    address = address.split(" "); // ['35', 'w', '35', 'ave'] 
 
    var indexes = { 
 
    streetIndex: -1, 
 
    directionIndex: -1 
 
    }; 
 
    address.forEach(function(addressElement, indexOfAddressElement) { 
 
    if (addressObject.streets.indexOf(addressElement) > -1) { 
 
     indexes.streetIndex = indexOfAddressElement; 
 
    } else if (addressObject.directions.indexOf(addressElement) > -1) { 
 
     indexes.directionIndex = indexOfAddressElement; 
 
    } 
 
    }); 
 
    return addSentenceVariationsToAddressLists(address, indexes); 
 
} 
 
var addressLists = getAddressLists(adr); 
 
console.log(addressLists);