Javascript:使用键从数组中查找双复制值
标题几乎是不言自明的 我希望能够从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
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在回答中提到的那样,他补充了一些关于如何工作的解释<代码>映射和
减少
只要熟悉它们就不难了。只是需要以一种新的方式思考。