标题非常自我解释......
我希望能够从JavaScript数组中找到重复的值。
可以复制数组键,因此我只需要验证数组值。
以下是一个例子:
var arr=[
Ibanez: 'JoeSatriani',
Ibanez: 'SteveVai',
Fender: 'YngwieMalmsteen',
Fender: 'EricJohnson',
Gibson: 'EricJohnson',
Takamine: 'SteveVai'
];
在那个例子中:
关键是吉他品牌 值是吉他手的名字。所以:
如果有重复的密钥(例如:Ibanez
或Fender
),那么当前示例就可以了: - )
但是
如果有重复的值(例如:EricJohnson
或SteveVai
),我希望得到(返回)该错误:
EricJohnson,SteveVai
答案 0 :(得分:1)
您无法在Javascript中拥有关联数组。您可以创建一个对象数组,例如:
var arr=[
{Ibanez: 'JoeSatriani'},
{Ibanez: 'SteveVai'},
{Fender: 'YngwieMalmsteen'},
{Fender: 'EricJohnson'},
{Gibson: 'EricJohnson'},
{Takamine: 'SteveVai'}
];
然后你需要一个for...in
循环来遍历数组中的每个对象,创建一个新的值数组并检查那个是否重复,这也不是很重要直截了当 - 基本上你想要对数组进行排序,并确保没有任何值与之后的数据相同。
var arrayOfValues = [];
arr.forEach(function(obj){
for(var prop in obj)
arrayOfValues.push(obj[prop]);
});
arrayOfValues.sort(); // by default it will sort them alphabetically
arrayOfValues.forEach(function(element,index,array){
if(array[index+1] && element==array[index+1])
alert("Duplicate value found!");
});
答案 1 :(得分:1)
首先,对象键不能重复。
这意味着:
({
"Fender": "Jim",
"Fender": "Bob"
})["Fender"]
简单地回复:“鲍勃”。
但是,我确实制作了一个代码,可以让你找到重复的值,但正如我所说,密钥必须是唯一的:
var arr = {
Ibanez: 'EricJohnson',
Fender: 'YngwieMalmsteen',
Gibson: 'EricJohnson',
Takamine: 'SteveVai',
"Takamine2": 'SteveVai'
};
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
var track = [];
var exists = [];
for (var val in arr) {
if (contains(track, arr[val])) {
exists.push(arr[val]);
} else {
track.push(arr[val])
}
}
alert(exists)
您可以在此处看到它:http://jsfiddle.net/dr09sga6/2/
答案 2 :(得分:1)
正如其他人所评论的那样,您提供的示例数组不是有效的JavaScript数组。但是,您可以为每种吉他类型保留一个列表:
var mapping = {
Ibanez: ['JoeSatriani','SteveVai'],
Fender: ['YngwieMalmsteen','EricJohnson']
Gibson: ['EricJohnson'],
Takamine: ['SteveVai']
];
或每个吉他/音乐家对的列表:
var pairs = [
['Ibanez','JoeSatriani'],
['Ibanez','SteveVai'],
['Fender','YngwieMalmsteen'],
['Fender','EricJohnson'],
['Gibson','EricJohnson'],
['Takamine','SteveVai']
];
您的解决方案将取决于您使用的模式。但是,在第二种情况下,它可以在一个链式函数调用中完成:
pairs.map(function(e) {return e[1]}) // Discard the brand names
.sort() // Sort by artist
.reduce(function(p,c,i,a){
if (i>0 && a[i]==a[i-1] && !p.some(function(v) {return v == c;})) p.push(c);
return p;
},[]); //Return the artist names that are duplicated
http://jsfiddle.net/mkurqmqd/1/
要打破reduce
调用一下,这里再次回调:
function(p,c,i,a){
if (i>0
&& a[i]==a[i-1]
&& !p.some(function(v) {
return v == c;
}))
p.push(c);
return p;
}
reduce
将为数组中的每个元素调用我们的回调函数,它将把每个调用的返回值作为第一个参数(p
)传递给下一个调用。当您在数组中移动时,它对于累积列表非常有用。
因为我们正在回顾上一个项目,所以我们需要确保我们不会超出第0项的范围。
然后我们检查此项是否与(已排序)列表中的上一项匹配。
然后我们检查(使用Array.prototype.some()
)我们在重复列表中找到的值是否为ALREADY ...以避免重复重复!
如果所有这些检查都通过,我们会将名称添加到我们的重复值列表中。