javascript 检查是否没有数组元素满足条件

4xrmg8kj  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(144)

只有当没有数组元素满足条件时,我才需要在JavaScript代码中执行操作。最佳的方法是什么?
在这个特定的例子中,我需要将一些东西推送到dataLayer,只有当它还不存在的时候。我是这么做的

if (!window.dataLayer.some(
     (element) => element.event === 'some_label',
   )) {
    gtm.push(someTrackingObject);
   }

有更好/更简洁的方法吗?

toe95027

toe950271#

您可以使用.every()
如果你想检查是否没有元素满足一个特定的条件,只需反转条件

datalayer.every((element) => element.event !== "some_label")

> true // if no elements has "some_label"
> false // if some element has "some_label"

使用.some()已经足够好了,所以.every()只是一种替代方法。

zqry0prt

zqry0prt2#

当前使用Array.prototype.some()的方法对于检查是否没有数组元素满足条件是最佳的,因为一旦满足条件,它就会停止迭代数组,从而避免不必要的迭代。

if (!window.dataLayer.some((element) => element.event === 'some_label')) {
    gtm.push(someTrackingObject);
}

但是,如果你想要一个更简洁的版本,你可以使用Array. prototype. indexOf()方法来实现相同的结果:

if (window.dataLayer.indexOf(someTrackingObject) === -1) {
    gtm.push(someTrackingObject);
}

在这里,Array. prototype. indexOf()返回数组中可以找到给定元素的第一个索引,如果不存在,则返回-1。注意,此方法假设someTrackingObjectwindow. dataLayer数组中是唯一的。
这两种方法各有利弊:

      • Array. prototype. some():**
  • 优点:
  • 只要满足条件就停止对数组的迭代,从而在数组中较早找到元素的情况下更有效。
  • 缺点:
  • 不如**Array. prototype. indexOf()**简洁
      • Array. prototype. indexOf():**
  • 优点:
  • 比Array. prototype. some()更简洁。
  • 缺点:
  • 不停止对数组的迭代,如果在数组中发现元素的时间较晚,则这可能会降低效率。

综上所述,当前使用Array. prototype. some()的方法最适合检查是否没有数组元素满足条件,如果someTrackingObjectwindow. dataLayer数组中是唯一的,则可以考虑使用**Array. prototype. indexOf()**以获得更简洁的版本。

nukf8bse

nukf8bse3#

你所做的是一个很好的方法。您也可以使用.every()并检查!== 'some_label'
如果你有大量的数据,你可以使用一个Map或设置,以提高查找时间的效率。但只有当您有多个查找和一个大数组大小时,这才有意义。

// build set with set and events
const set = window.dataLayer.reduce((acc, el) => {
    acc.add(el.event);
    return acc;
}, new Set())

// check if the set includes the label
if (!set.includes('some_label')) {
    gtm.push(someTrackingObject);
}

更新

搜索元素。.find在第一次匹配时退出,因此您不必检查数组中的每个元素。

// check if the set includes the label
if (window.dataLayer.find(el => el.event === 'some_label') === undefined) {
    gtm.push(someTrackingObject);
}

相关问题