JavaScript获取唯一键值

3

我有一个包含以下元素的数组:

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

我希望提取所有唯一的名称(从“名称”字段中)。 (以创建一个将特定工作的所有详细信息分组的新对象)。
请问您能否展示一种有效的方法?

“unique names” 是什么意思?你需要一个数组还是想要单独的变量? - Vijay Verma
你能展示对象的结构或包含对象的数组吗?是否有多个对象需要进行比较?目前只有一个名称,根据定义它是唯一的。 - David Thomas
感谢您的评论,我需要一个包含所有唯一职位名称的数组。我已经编辑了代码,请告诉我现在是否清晰。 - user429400
3个回答

5
你是想要一个对象列表,然后提取所有唯一的值吗?
这里有一种相当有效的方法,将值存储为一个名为uniq的新对象的键,而值则是'Details'元素的数组。
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/


然后,你只需要迭代你的数据并检查在 uniq 对象中是否有键 "Name" 的值大于1。但要注意:如果你的名称包含对于 JSON 键无效的字符,则此解决方案将无法工作。 - clentfort
没错。但他的问题改变了。他想把所有的“详细信息”都分组。 - Luca Matteis
哦,我没看到那个。我总是喜欢这种情况,特别是如果突然间所有给出的答案都错得离谱!好的解决方案,我会接受它! - 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/


这个解决方案只会删除那些具有重复名称的元素,在结果数组中它们是唯一的,但在此之前它们并不唯一。 - clentfort
@clentfort:不,这会获取所有唯一工作名称的数组,正是OP所要求的。 - Guffa

1
以下代码片段应该可以解决问题:
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, "");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接