2014-10-08 41 views
0

這似乎是應該很容易做的事情,但我找不到任何可行的解決方案。基本的想法是擁有一個與url關聯的代碼數組,並且根據哪個url被解析爲引用者,代碼被插入到localStorage中。如何在Javascript或Jquery中關聯兩個值?

var site = { 
「example1.com」 : "x10", 
「example2.com」 : "x11", 
「example3.com」 : "x12" 
} 

if (document.referrer.indexOf(sitevalue) != -1) {  

    if (localStorage) { 
    localStorage.setItem("code",sitekey); 
} 
} 

因此,如果引用者是example1.com,那麼localStorage中的代碼將設置爲「x10」,依此類推。我已閱讀可能使用Underscore.js _Invert方法,但我認爲這是一個更明顯的解決方案,我失蹤了。

+2

它只是一個對象。 '.setItem(「code」,site ['example1.com'])' – 2014-10-08 18:33:50

回答

2

這是稍微低效率的,因爲它使處理找到了比賽後,但它是非常簡單的代碼:

Object.keys(site).forEach(function(key) { 
    if (document.referrer.indexOf(key) > -1) { 
     if (localStorage) { 
      localStorage.setItem("code", site[key]); 
     } 
    } 
}); 

更新:只注意到下劃線標記。以下劃線,我可能會改變稍微循環,要做到這一點,而不是:

_.forEach(_.pairs(site), function(pair) { 
    if (document.referrer.indexOf(pair[0]) > -1) { 
     if (localStorage) { 
      localStorage.setItem("code", pair[1]); 
     } 
    } 
}); 

唯一的顯著優點是,這可能工作在不支持Object.keys,或Array.prototype.forEach舊的環境。

+0

結束使用這個,它工作的很棒!謝謝。 – Epleroma 2014-10-08 19:10:55

1

如果你想獲得"x10"您可以通過site["example1.com"]得到它,等

我敢肯定你的具體要求,但這樣可以解決我的理解:

var site = { 
    "example1.com" : "x10", 
    "example2.com" : "x11", 
    "example3.com" : "x12" 
} 

if (document.referrer.indexOf(sitevalue) != -1) {  
    if (localStorage) { 
     var url = document.referrer.replace('www.','') 
     var host = url.match(/:\/\/(.[^/]+)/)[1]; 
     localStorage.setItem("code", site[host]); 
    } 
} 

請注意,我添加了一些代碼,以刪除可能的領先www.以及通過正則表達式從提供的URL退出主機名。

+1

請記住,對象鍵不一定是'document.referrer'提供的字符串的*整數*(這就是爲什麼我被刪除我的回答是,我沒有時間清理提供的URL來檢索hostName)。 – 2014-10-08 18:39:19

+1

@DavidThomas好點。我會花時間更新我的答案。 – 2014-10-08 18:41:26

+0

@DavidThomas完成。再次感謝。 – 2014-10-08 18:45:21

1

如果您想要利用Underscore.js,下面的獨立工作示例說明如何循環訪問site對象中的鍵,並且如果有人匹配引用者字符串,則將其相應代碼隱藏在localStorage中。

<script src="http://underscorejs.org/underscore-min.js"></script> 

<script> 

    // this variable is just for testing 
    var myReferer = "http://example2.com"; 

    var site = { 
     "example1.com": "x10", 
     "example2.com": "x11", 
     "example3.com": "x12" 
    }; 

    if (localStorage) { 
     _.each(site, function (value, key) { 
      // you'd replace "myReferer" with "document.referrer" here 
      if (myReferer.indexOf(key) !== -1) { 
       localStorage.setItem("code", value); 
      } 
     }); 
    } 

    // this is also just for testing 
    alert(localStorage["code"]); 
</script> 
+1

非常感謝你的工作,但我現在最終只使用了更簡單的JS解決方案。然而,使用underscore.js方法對於我計劃在未來使用它的其他站點來說非常有用。 – Epleroma 2014-10-08 19:12:43

+0

D'oh!在我的Underscore解決方案中,我忘記了_.each可以用於對象。我想我剛剛把自己的大腦卡在了我自己的[Ramda](https://github.com/CrossEye/ramda)庫中! :-) – 2014-10-08 20:09:57

+0

@Scott無論如何,使用像Object.keys()和Array.prototype.forEach()這樣的內置JavaScript方法總是比較酷。只要我們不必支持舊版本的_that-browser-I-shall-not-mentioned-here _... – 2014-10-08 20:14:54

相關問題