Javascript:使用键从数组中查找重复值

时间:2015-04-19 16:57:32

标签: javascript arrays string key

标题非常自我解释......

我希望能够从JavaScript数组中找到重复的值。

可以复制数组键,因此我只需要验证数组值。

以下是一个例子:

var arr=[
    Ibanez:     'JoeSatriani',
    Ibanez:     'SteveVai',
    Fender:     'YngwieMalmsteen',
    Fender:     'EricJohnson',
    Gibson:     'EricJohnson',
    Takamine:   'SteveVai'
];

在那个例子中:

关键是吉他品牌 值是吉他手的名字。

所以:

如果有重复的密钥(例如:IbanezFender),那么当前示例就可以了: - )

但是

如果有重复的值(例如:EricJohnsonSteveVai),我希望得到(返回)该错误:

EricJohnson,SteveVai

3 个答案:

答案 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 ...以避免重复重复!

如果所有这些检查都通过,我们会将名称添加到我们的重复值列表中。