对象数组检查它是否包含键值对;在哪个位置 - Javascript



我尝试检查对象数组是否具有键值对,键service_tagsarray的值包括字符串"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};
        }
      });

感谢您的帮助!

我尝试检查对象数组是否具有键值对与键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中的所有条目,而不仅仅是查看第一个条目。

根据 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)

其他解决方案也很棒,但这里有一个使用 .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)

干杯!

最新更新