2012-10-04 39 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, ""); 
}