2010-07-22 94 views
0

在处理从YQL返回的JSON时,我发现自己正在寻找一种方法从数组中提取所有唯一值。数组唯一值

function uniqueArrayValues(o){ 
     var items = o.query.results.row, 
      output = []; 

    function check(val){ 
    for(var c=0; c<output.length; c++){ 
     if(output[c] === val){ 
     return false; 
     } 
    } 
    return true; 
    } 

for(var i=1; i<items.length; i++){ 
    if(check(items[i].team)){ 
    output.push(items[i].team); 
    }  
    } 

    return output; 
} 

该代码看起来有点太“忙”,我想知道是否有更优雅的方式从数组中提取唯一值。

+0

您可以将YQL查询中过滤重复值,如果是一个选项给你。参见http://developer.yahoo.com/yql/guide/sorting.html ---类似'| unique(field =“row.team”)(该字段可能不同,具体取决于结果结构)。 – salathe 2010-07-22 12:02:15

+0

这将工作,如果我只需要唯一的值,但我从客户端(我只提出一个YQL请求)的对象中提取这些值。 – 2010-07-22 13:39:52

+0

@Q,够公平的。 [eskimoblood's](http://stackoverflow.com/questions/3308257/array-unique-values/3308650#3308650)答案应该帮助你。 – salathe 2010-07-22 14:44:16

回答

1

可以使用的indexOf检查元素是否在数组中。

function check(val){ 
     return output.indexOf(val) != -1; 
    } 

,或者如果你有一个唯一的ID或名称中使用的对象,而不是一个数组: VAR输出= {}

for(var i=1; i<items.length; i++){ 
    if(!output[items[i].team.id])){ 
    output [items[i].team.id] = items[i].team; 
    }  
    } 
-1

如果您的数组具有非平凡的长度,则提取唯一元素的标准方法是对数组进行排序或散列。

编辑:一些伪代码

sort array 
last = unused 
for each v in array do 
    if v != last 
    uniqueArray.push_back(v) 
    last = v 
    end if 
end for 
// uniqueArray now contains the unique elements of array 
+2

请给我看看代码。 – 2010-07-22 13:42:01