【问题标题】:JavaScript Finding if string in array can be found in an objectJavaScript查找数组中的字符串是否可以在对象中找到
【发布时间】:2016-09-23 23:51:12
【问题描述】:

我有一个包含不同角色的对象,我有一个包含特定颜色的数组。

我想要做的是查看 roles.name 是否包含颜色数组中的任何字符串。我尝试了不同的方法,例如:

var colors = ["blue", "yellow", "brown", "red", "green", "pink", "purple"];
var roles = [{"name": "asd"},
            {"name": "blue"},
            {"name": "yellow"},
            {"name": "brown"}, 
            {"name": "red"},
            {"name": "green"},
            {"name": "pink"},
            {"name": "purple"},
            {"name": "fgh"},
            {"name": "jkl"}];
for (var i = 0; i < roles.length; i++) {
    if (roles[i].name.indexOf(colors)) {
   console.log(roles[i].name);
  }
}

和

var colors = ["blue", "yellow", "brown", "red", "green", "pink", "purple"];
var roles = [{"name": "asd"},
            {"name": "blue"},
            {"name": "yellow"},
            {"name": "brown"}, 
            {"name": "red"},
            {"name": "green"},
            {"name": "pink"},
            {"name": "purple"},
            {"name": "fgh"},
            {"name": "jkl"}];
roles.forEach(role => {
    if (role.name.indexOf(colors)) {
    console.log(role.name);
  }
});

但是对于这两个代码,结果是完整的角色列表。

预期结果是记录到控制台的所有颜色。我得到的是记录到控制台的所有角色。

【问题讨论】:

  • 在ES6中可以使用Array#find和Array#findIndex,还有Array#includes
  • 你的对象有所有同名的键,从字面上看,它们都叫name,所以你覆盖了之前的键和值。
  • 当您将对象视为数组时,如何记录所有角色?
  • var 角色不正确,实际上并非如此。我在那部分犯了一个错误。它们实际上都是独立的对象。我编辑了我的问题。

标签: javascript arrays for-loop foreach indexof


【解决方案1】:

您正在向后使用indexOf。它应该是array.indexOf(valueToSearchFor),但你有valueToSearchFor.indexOf(array)。此外,indexOf 返回索引,而不是布尔值;要测试是否找到该元素,您必须将其与-1 进行比较。

var colors = ["blue", "yellow", "brown", "red", "green", "pink", "purple"];
var roles = [{"name": "asd"},
        {"name": "blue"},
        {"name": "yellow"},
        {"name": "brown"}, 
        {"name": "red"},
        {"name": "green"},
        {"name": "pink"},
        {"name": "purple"},
        {"name": "fgh"},
        {"name": "jkl"}];
for (var i = 0; i < roles.length; i++) {
  if (colors.indexOf(roles[i].name) != -1) {
    console.log(roles[i].name);
  }
}

【讨论】:

  • 啊,我实际上尝试过这种方法,但没有!= -1。不知道它不会返回布尔值。谢谢。
  • 这个错误没有任何借口。我敢打赌,每个使用 indexOf 的教程都会解释它。
【解决方案2】:

var colors = ["blue", "yellow", "brown", "red", "green", "pink", "purple"];
var roles = [{"name": "asd"}, {"name": "blue"}, {"name": "yellow"}, {"name": "brown"},{"name": "red"}, {"name": "green"}, {"name": "pink"}, {"name": "purple"}, {"name": "fgh"}, {"name": "jkl"}];
var discovered = [];
for (var i = 0; i < roles.length; i++) {
   for (var j=0 ; j < colors.length ; j++){
     if (roles[i].name == colors[j]) {
        discovered.push(roles[i]);
     }
   }
}

console.log(discovered);

【讨论】:

    【解决方案3】:

    你的角色只是一个对象。更喜欢这种格式。

        let colors = [
        {
            "name": "blue"
        },
        {
            "name": "yellow"
        },
        {
            "name": "brown"
        },
        {
            "name": "red"
        },
        {
            "name": "green"
        },
        {
            "name": "pink"
        },
        {
            "name": "purple"
        }
    ]
    

    这是使用.map()的每种颜色

    colors.map(function (color) {
        console.log(color.name)
    })
    

    【讨论】:

      【解决方案4】:

      您在调用indexOf 时切换了角色和颜色。 并且 'indexOf' 不返回 'boolean' 而是一个整数,如果它返回 0 它将评估为 'false ',这将导致错误的结果。

      roles.forEach(function (role) {
        if (colors.indexOf(role.name) >= 0) {
          console.log(role.name);
        }
      });
      

      【讨论】:

        猜你喜欢
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 2022-12-03
        • 1970-01-01
        • 2016-06-17
        • 2019-07-06
        • 2017-04-07
        相关资源
        最近更新 更多