2012-10-04 40 views
2

我有一個包含下列元素的數組:的JavaScript獲得唯一鍵值

var jobName = getNextJobName(); 
var Details = getNextJobDetails(); 
var item = { 
      Name: jobName, 
      Details: Details 
     }; 
array.push(item); 

我想提取(從名稱字段)的所有唯一的名稱。 (爲了創建一個新的對象,它將特定作業的所有細節分組)。

可否請你告訴我一個有效的方式來做到這一點?

+0

獨特的名字「意味着什麼?你需要一個數組或者你需要單個變量。 –

+0

你能顯示對象的結構,或含有該(多個)對象,是否有多個對象陣列被比較?就目前而言,你只有一個名字,根據定義它是唯一的。 –

+0

感謝您的評論,我需要一個包含所有獨特作業名稱的數組。我編輯了代碼,請告訴我現在是否清楚。 – user429400

回答

5

你的意思是有這些對象的列表,並你想提取所有的獨特值?

這裏的一個非常有效的方式,存儲所述值作爲一個新的對象的密鑰稱爲uniq和值是「詳細信息」元件的陣列。

var arr = [ { Name: 'Alex', Details: 'Foo' }, { Name: 'Igor', Details: 'None' }, { Name: 'Alex', Details: 'Boo' } ]; 
var uniq = {}; // contains all the unique names 
for(var i=0; i<arr.length; i++) { 
    var el = arr[i].Name; 
    if(!uniq[el]) uniq[el] = []; // start the array 
    uniq[el].push(arr[i].Details); 
} 

http://jsfiddle.net/lmatteis/8LWMH/4/

+0

那之後,所有您需要做的是遍歷你和'uniq'對象檢查關鍵'「名稱」'有一個值大於1,但要注意:該解決方案將無法正常工作,如果你的名字包含對JSON密鑰無效的字符。 – clentfort

+0

對呀。但他的問題改變了。他想分組所有'細節'的東西。 –

+0

哦,我沒有看到。當這種情況發生時,我總是喜歡,特別是如果突然間所有給出的答案都是錯誤的數英里!好的解決方案,我會接受它! – clentfort

2

您可以使用一個對象來高效完成匹配,然後讀取從對象名稱到一個數組:

var unique = {}; 
for (var i = 0; i < jobs.length; i++) { 
    unique[jobs[i].Name] = 1; 
} 
var uniqueArray = []; 
for (n in unique) uniqueArray.push(n); 

演示:http://jsfiddle.net/Guffa/4cH4F/

+0

該解決方案只刪除的東西,有重名,結果數組它們是唯一的,但他們之前是不是唯一的。 – clentfort

+0

@clentfort:不,這得到所有的獨特作業名,正是OP要求的數組。 – Guffa

0

下面的代碼片段應該做的伎倆:

var _bzAppUnique = 0; //unique variable to increase at each call 
function uniqueID() { 
    var d = new Date(); 
    var u = d.getFullYear() + "," + d.getMonth() + "," + 
      d.getHours() + "," + d.getMinutes() + "," + 
      d.getSeconds() + "," + _bzAppUnique; 
    _bzAppUnique++; 
    return u.replace(/\,/g, ""); 
}