挑战:使用 forEach

问题描述

我在 forEach 函数的语法和应用方面遇到了很多麻烦。请帮忙!

重新创建上一个挑战中的函数 droids,但不要使用 FOR 循环,而是使用内置的 forEach 方法

之前的挑战:

function droids(arr) {
  let result = '';
 for (let str of arr) {
      if (str  === 'Droids') {
       return 'Found Droids!';
    }
}
       return `These are not the droids you're looking for.`;
}


// Uncomment these to check your work! 
const starWars = ["Luke","Finn","Rey","kylo","Droids"] 
const thrones = ["Jon","Danny","Tyrion","The Mountain","Cersei"] 
console.log(droids(starWars)) // should log: "Found Droids!"
console.log(droids(thrones)) // should log: "These are not the droids you're looking for."

这就是我所拥有的:

function droids(arr) {
  let result = "";
arr.forEach(item => 
console.log(result))
if (result = "Droids") {
return "Found Droids!"
} else {
  return "These are not the droids you're looking for.";
}};

解决方法

您无法在 forEach 循环中从回调中返回值,因此您需要依赖副作用 - 给 result 一个默认值,表示您没有找到 {{1} } 然后将它设置为 Droids 仅当您匹配数组中某处的 "Found Droids!" 时:

Droids

,

if (result = "Droids") 这不检查,它分配。您想使用 ==

您不想从 forEach 方法内部返回。您需要分配结果并在处理记录后返回该结果。

请务必将项目与您要查找的字符串值进行比较。

function droids(arr) {
  let result = "";
  let foundDroids = false;
  arr.forEach(item => {
    if (!foundDroids) {
      if (item == "Droids") {
        result = "Found Droids!"
        foundDroids = true;
      } else {
        result = "These are not the droids you're looking for.";
      }
    }
  });
  return result;
};

const starWars = ["Luke","Finn","Droids","Rey","Kylo"] 
const thrones = ["Jon","Danny","Tyrion","The Mountain","Cersei"] 
console.log(droids(starWars)) 
console.log(droids(thrones))

我更愿意像这样使用 Array.includes

function droids(arr) {
  if (arr.includes("Droids")) {
    return "Found Droids!";
  } else {
    return "These are not the droids you're looking for.";
  }
};

const starWars = ["Luke","Cersei"] 
console.log(droids(starWars)) 
console.log(droids(thrones))

,

我不会使用 Array.prototype.forEach,而是使用 Array.prototype.some 来确定该项目是否存在。

someforEach 方法具有相同的签名,只是您需要返回一个布尔值。如果您返回 true,该方法将在找到匹配项后立即短路并停止迭代。性能更好。

const search = (items,target,foundText,notFoundText) =>
  items.some(item => item === target) ? foundText : notFoundText;

const droids = (names) => search(names,'Droids','Found Droids!',"These are not the droids you're looking for.");

// Uncomment these to check your work! 
const starWars = ["Luke","Kylo","Droids"]
const thrones = ["Jon","Cersei"]
console.log(droids(starWars)) // "Found Droids!"
console.log(droids(thrones))  // "These are not the droids you're looking for."

由于这是一个原始数组,您也可以使用 Array.prototype.includes

const search = (items,notFoundText) =>
  items.includes(target) ? foundText : notFoundText;

const droids = (names) => search(names,"Cersei"]
console.log(droids(starWars)) // "Found Droids!"
console.log(droids(thrones))  // "These are not the droids you're looking for."