如何只将唯一值添加到JavaScript数组中?
这是我定义的数组,下面代码将重复值添加到数组中,但我不想添加重复值(如果已存在于ary
中)
,有什么帮助吗?
var ary = [];
function setFavorite(name, value){
var obj = {};
obj[name] = value;
ary.push(obj);
....
....
答案 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 demo和here (MDN)。后者甚至有一个关于使用对象作为地图的部分。