我正在尝试在品种阵列和狗阵列之间找到匹配。如何返回找到的第一个匹配项。这就是我所拥有的似乎不起作用,我无法找到错误。感谢
var dogs = ["pug", "husky", "hound", "poodle"];
function findTheBreed(dogs) {
var breeds = ["terrier", "mix", "lab", "hound"];
for(let i = 0; i < dogs.length; i++) {
for (let b = 0; b < breeds.length; b++) {
if(dogs[i] === breeds[b]) {
return breeds[b]
} else {
return "no match"
}
}
}
}
答案 0 :(得分:2)
你在第一次不匹配时返回false,而你应该继续迭代。
在迭代完所有内容之后移动return "no match"
。
您也可以使用此处的indexOf
:
function findTheBreed(dogs) {
var breeds = ["terrier", "mix", "lab", "hound"];
for(let i = 0; i < dogs.length; i++) {
if(breeds.indexOf(dogs[i]) != -1){
return dogs[i];
}
}
return "no match";
}
另一个(在我看来最好的)路线是使用Array.filter功能并检索整个匹配数组。
var breeds = ["terrier", "mix", "lab", "hound", "snickerdoodle"];
var filtered = breeds.filter(
function (elem) {
return dogs.indexOf(elem) != -1
}
);
return filtered;
答案 1 :(得分:2)
将一个数组转换为字典并进行直接查找会更简单。
例如,如果将狗变成字典
var dictionary = {};
for(var i=0;i<dogs.length;i++){
dictionary[dogs[i]] = true;
}
for(var i=0;i<breeds.length;i++){
if(dictionary[breeds[i]] === true) return true; //found match
}
答案 2 :(得分:2)
或更短:
mtkView.sampleCount = 1
http://jsbin.com/mubatiyebo/edit?console
使用 Array.prototype.find ,箭头功能和精彩的 OR 运算符......
答案 3 :(得分:1)
要修复您的实施,请将return "no match"
移出循环体到findTheBreed
函数的末尾。
但是,通过利用恒定时间Set.has
查找,您可以更快地找到第一个匹配 - 在恒定时间内:
function match(dogs, breeds) {
return dogs.find(Set.prototype.has, new Set(breeds));
}
let dogs = ["pug", "husky", "hound", "poodle"];
let breeds = ["terrier", "mix", "lab", "hound"];
console.log(match(dogs, breeds));
&#13;
此外,我认为您应该考虑重命名数组,因为目前dog
和breed
之间没有区别。另外,您可以考虑从一开始就将breeds
声明为Set
,以避免冗余转换。
答案 4 :(得分:0)
您过早退回此功能。 如果您想要相同的数据结构,可以试试这个:
var dogs = ["pug", "husky", "hound", "poodle"];
function findBreed(dogs) {
var breeds = ["terrier", "mix", "lab", "hound"];
for (let i = 0; i < dogs.length; i++){
var dog = dogs[i];
var successIdx = breeds.indexOf(dog)
if (successIdx !== -1){
return dog
}
}
return "no match"
}