【问题标题】:Array of objects check if it includes key value pair; on which position - Javascript [duplicate]对象数组检查它是否包含键值对;在哪个位置 - Javascript [重复]
【发布时间】:2019-05-27 00:44:40
【问题描述】:

我尝试检查一个对象数组是否有一个键值对,键为service_tags,值为array,包括字符串"trace"。如果这个数组有的话,我也想返回对象的位置。

我的尝试返回undefined

gg.fields =
[  
    { ... },
    {value: "D", display_name: "Nat."},
    {  
       "value":"Likes redwine",
       "display_name":"Trace 2",
       "servicio_tags":[  
          "trace"
       ]
    }
 ]


 //function    

 let traceFieldExists = gg.fields.forEach((field, positionOfTraceField) => {
        if (field.servicio_tags && field.servicio_tags[0] === 'trace') {
            return {
              positionOfTraceField : positionOfTraceField,
              exists : true
            };
          } else {
            return {exists : false};
        }
      });

感谢您的帮助!

【问题讨论】:

  • "Foreach 返回 void" JavaScript 没有 void 类型(奇怪的是,它有一个同名的运算符)。 Array.prototype.forEach 返回undefined
  • 是的,我现在试着让我的标题更具体。感谢您的评论。

标签: javascript arrays object foreach


【解决方案1】:

我尝试检查一个对象数组是否有一个键值对,键为 service_tags 和一个包含字符串“trace”的数组值

forEach 不这样做。它总是返回undefined。如果您只想知道是否存在这样的条目,请使用some。如果要检索第一个匹配条目,请使用 find。如果您想要第一个匹配条目的索引,请使用findIndex

你的编辑在标题中添加了“在哪个位置”,这让我觉得你想要findIndex

let traceFieldIndex = gg.fields.findIndex(field => {
    return field.servicio_tags && field.servicio_tags[0] === 'trace';
});

traceFieldIndex 将包含数组中第一个条目的索引,回调为其返回了一个真值,或者-1 如果处理了整个数组并且回调从未返回一个真值。

如果field.servicio_tags 可能有'trace' 但不在索引0 处,您可能需要includes

let traceFieldIndex = gg.fields.findIndex(field => {
    return field.servicio_tags && field.servicio_tags.includes('trace');
});

这将搜索field.servicio_tags 中的所有条目,而不是只查看第一个条目。

【讨论】:

  • 谢谢@T.J.克劳德我用了你建议的例子。效果很好!
【解决方案2】:

根据mdn forEach 返回一个未定义的。所以得到条件匹配的索引你可以使用reduce函数

let ggFields = [{
    'value': "D",
    'display_name': "Nat."
  },
  {
    "value": "Likes redwine",
    "display_name": "Trace 2",
    "servicio_tags": [
      "trace"
    ]
  }
]


let k = ggFields.reduce(function(acc, curr, index) {
  if (curr.hasOwnProperty('servicio_tags') && curr.servicio_tags.includes('trace')) {
    acc.push(index)

  }

  return acc;

}, [])
console.log(k)

【讨论】:

    【解决方案3】:

    其他解决方案也很棒,但这里有一个使用 .map 的解决方案,它将为数组中的每个值返回一些内容,首先通过 if 条件运行:

    const gg = {};
    gg.fields =
    [  
      {value: "D", display_name: "Nat."},
      {  
         "value":"Likes redwine",
         "display_name":"Trace 2",
         "servicio_tags":[  
            "trace"
         ]
      }
    ]
    
    
    const traceFieldExists = gg.fields.map((field, inx) => {
      if (field.servicio_tags && field.servicio_tags[0] === 'trace'){
        return {
          positionOfTraceField : inx,
          exists : true
        };
      } else {
        return {
          exists: false
        }
      }
    });
    console.log(traceFieldExists)

    干杯!

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2020-08-11
      • 2017-03-19
      • 2019-08-24
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多