【问题标题】:Array unique values数组唯一值
【发布时间】:2010-07-22 11:21:46
【问题描述】:

在处理从 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;
}

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

【问题讨论】:

  • 您可以过滤到 YQL 查询中的唯一值,如果您愿意的话。请参阅developer.yahoo.com/yql/guide/sorting.html --- 类似于| unique(field="row.team")(字段可能不同,具体取决于结果结构)。
  • 如果我只需要唯一值,这将起作用,但我从客户端已经存在的对象中提取这些值(我只发出一个 YQL 请求)。
  • @Q,很公平。 eskimoblood's 回答应该可以帮到你。

标签: javascript json yql


【解决方案1】:

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

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

如果您有唯一的 id 或名称,则使用对象而不是数组: 变量输出 = {}

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

【讨论】:

    【解决方案2】:

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

    编辑:一些伪代码

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2013-08-24
      相关资源
      最近更新 更多