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

Javascript:使用键从数组中查找双复制值,javascript,arrays,string,key,Javascript,Arrays,String,Key,标题几乎是不言自明的 我希望能够从JavaScript数组中找到重复的值 数组键可以复制,因此我只需要验证数组值 以下是一个例子: var arr=[ Ibanez: 'JoeSatriani', Ibanez: 'SteveVai', Fender: 'YngwieMalmsteen', Fender: 'EricJohnson', Gibson: 'EricJohnson', Takamine: 'S

标题几乎是不言自明的

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

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

以下是一个例子:

var arr=[
    Ibanez:     'JoeSatriani',
    Ibanez:     'SteveVai',
    Fender:     'YngwieMalmsteen',
    Fender:     'EricJohnson',
    Gibson:     'EricJohnson',
    Takamine:   'SteveVai'
];
在这个例子中:

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

因此:

如果存在与当前示例相同的重复钥匙(如:
Ibanez
Fender
),则可以:-)

但是

如果存在重复的值(如:
EricJohnson
SteveVai
),我希望得到(返回)该错误:

EricJohnson,SteveVai

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!");
});

首先,对象键不能重复

这意味着:

({
    "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)
var-arr={
伊巴内兹:“埃里克·约翰逊”,
挡泥板:“YngwieMalmsteen”,
吉布森:“埃里克森”,
Takamine:“SteveVai”,
“Takamine2”:“SteveVai”
};
函数包含(a,obj){
对于(变量i=0;i

您可以看到它在这里工作:

正如其他人所评论的,您提供的示例数组不是有效的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

要稍微降低调用次数,请再次执行回调:

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()
)我们找到的值是否已经在重复项列表中…以避免出现重复项


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

“带键数组”?很抱歉,Javascript中不存在这种情况,您的数据结构要么错误,要么不同。代码值1024个单词。提供一个您实际处理的数据结构示例,该示例将正确解析(所示的不会),显示您想要的结果,解释从前者到后者的任何逻辑,这些逻辑可能不明显(例如:解释所有逻辑),解释一下你在实现这种逻辑时遇到了什么问题。你不可能有相同的键。嗯,我认为这可能非常简单,但只是想澄清一下:吉他品牌可以复制价值观,吉他手不能。不确定为什么会被否决,因为它确实有效:我没有否决。。。很抱歉,但这对我来说很有效:)不,我不是故意叫你出去的。我只是想知道,很好的编码人!令人印象深刻:-)我知道我需要使用对象数组,正如@Sidd在回答中提到的那样,他补充了一些关于如何工作的解释<代码>映射
减少
只要熟悉它们就不难了。只是需要以一种新的方式思考。