如何在JavaScript数组中只添加唯一值?

时间:2015-04-08 18:30:22

标签: javascript jquery arrays

如何只将唯一值添加到JavaScript数组中?

这是我定义的数组,下面代码将重复值添加到数组中,但我不想添加重复值(如果已存在于ary中)   ,有什么帮助吗?

var ary = [];
function setFavorite(name, value){
    var obj = {}; 
    obj[name] = value; 

    ary.push(obj);
    ....
    ....

FIDDLE HERE

2 个答案:

答案 0 :(得分:5)

您可以使用普通对象来避免地图中的重复键(这正是您在此处所描述的)。

var map = {}; 

function setFavorite(name, value) { 
    map[name] = value; 
}

或者,如果您在尝试输入复制品时想要输入错误而不是覆盖,则可以:

 function setFavorite(name, value) { 
     if (map[name]) { 
         throw new Error('Cannot insert duplicate value'); 
     }
     map[name] = value; 
 }

要按键检索值,您可以通过保存的属性名称访问它。请注意,如果键值是变量,则必须使用数组表示法(带[]括号)。

  var value = map[key] 

或,

  var value = map.keyHappenedToBeValidIdentifier

要通过地图迭代,请使用Object.keys

Object.keys(map).forEach(function(key) { 
    var value = map[key]; 
    // do some useful work with the value 
}); 

答案 1 :(得分:5)

EcmaScript 6(暂时还不可用)将有native Sets

但是,由于这不是您目前想要的,因为没有人能够使用您的网站,请尝试Polyfill like this one或让您的代码在插入前检查数组中的值,例如使用此代码({ {3}}):

function contains (array, value) {
  var doesContain = false

  for (var i = 0, length = array.length; i < length; i++) {
    if (array[i] === value) {
      doesContain = true
      break
    }
  }

  return doesContain
}

编辑:没有阅读代码,只是描述。

实际上你想要的是Map / an Object。在设置该Object的属性之前,请检查它是否已存在:

if (object.hasOwnProperty(prop)) {
  throw new Error('Hey, you have already set ' + prop + '!')
} else {
  obj[prop] = value
}

您可以详细了解Object s demohere (MDN)。后者甚至有一个关于使用对象作为地图的部分。