使用`array.some()`返回一个元素,而不是布尔值

10
我正在尝试使用array.some函数遍历一些数据,并在if语句成功时返回我的field。但我发现实际上返回的是一个布尔值,比如true,而不是包含元素详细信息的变量。
for (var index in allFields) {
      const invalidField = allFields[index].some(function (field){
        if (!validation.getIn([index,field.dataset.fieldKey,'isValid'])) {
          return field;
        }
      });
      if (invalidField) {
        return invalidField;
      }
    }

我的代码循环遍历allFields,其中包含索引下的字段列表。然后将每个fieldKey与另一个名为validation的数据集进行比较。

field包含一个元素。我希望返回field,但当我检查invalidField时,我得到了true而不是元素。


2
some 返回一个布尔值,如果为 true,则终止迭代。 - Nina Scholz
2
array.some 的功能是按设计要求执行的。文档 如果你想要的是查找数组中的元素,也许 array.find() 文档 更适合你。 - ste2425
你在这里可能会感到困惑的是,你正在返回field,这是你从回调函数中想要的元素,但这不是some返回的内容。根据msn的说明,返回值为:如果回调函数对任何数组元素返回真值,则为true;否则为false。 field是“真值”,因此some返回true - Matt Burland
3个回答

11

Array.prototype.some() 只检查数组中是否有任何元素通过在回调函数中定义的测试。您应该使用数组 find 方法,它返回第一个通过测试的元素。


请注意find方法会返回数组中匹配的项或者undefined,因此在尝试使用该返回值之前最好先检查是否返回了undefined - ibrahim mahrir
希望有类似于 find() 的东西,但能够返回自定义的内容而不仅仅是元素。 - Drazen Bjelovuk

1

你应该使用 Array.prototype.filter 而不是 Array.prototype.some

filter() 会执行你当前期望 some() 执行的操作。当有一项或多项满足条件时,some() 返回一个布尔值,而 filter() 则创建一个包含满足条件的元素的新数组。


1
要获取元素,您需要使用array.filter()
for (var index in allFields) {
  const invalidField = allFields[index].filter(function (field){
    if (!validation.getIn([index,field.dataset.fieldKey,'isValid'])) {
      return field;
    }
  });
  if (invalidField.length > 0) { //check if returned anything
    return invalidField[0];
  }
}

如果您只想返回第一个,可以使用array.find()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接