如何检查对象中多个数组的数组长度?

时间:2018-04-18 13:42:46

标签: javascript arrays

我有一个函数,它接受浏览器类型作为参数中的数组作为参数。我想为用户是否需要任何浏览器返回错误消息。为此,我使用了一个名为allTypeNumber的变量。我用于在下面的代码中返回错误。

我想检查每个数组的长度,如果它们都是0,我知道没有请求任何浏览器,但是如果不使用变量就混淆了如何做到这一点。

async retrievePartners (capabilities) {
    const appropriatePartners = { chrome: [], firefox: [], safari: [], ie: [] }
    const partners = await this.getAllPartners()
    let allTypeNumber = 0
    // first check if there is available appropriate Partners
    Object.keys(capabilities.type).forEach(key => {
      let typeNumber = parseInt(capabilities.type[key])
      allTypeNumber = allTypeNumber + typeNumber
      for (let i = 0; i < typeNumber; i++) {
        partners.forEach((partner, i) => {
          if (
            key === partner.value.type &&
            partner.value.isAvailable &&
            appropriatePartners[key].length < typeNumber
          ) {
            appropriatePartners[key].push(partner)
          }
        })

        if (appropriatePartners[key].length < typeNumber) {
          throw new Error(
            'Sorry there are no appropriate Partners for this session'
          )
        }
      }
    })

    if (allTypeNumber === 0) {
      throw new Error('Please mention at least 1 type of browser !')

我用这个参数调用它

const capabilities = { type: { chrome: 1 } }

1 个答案:

答案 0 :(得分:2)

检查数组的每个值是否为某种东西的简洁方法是使用every()(或其反向,some())。 every()将遍历数组中的每个元素并继续,只要它不断返回truthy值。 some()只要不断变得虚假就会继续前进。他们都会根据上次返回值返回truefalse

或者,如果您需要计数(而不仅仅知道是否至少有一个),您可以使用reduce()来创建总和。 reduce()遍历带有累加器的数组,适用于从数据数组中创建奇异值。

此外,如果您需要从object获取值,则使用Object.entries()Object.values()可能比使用键更清晰。 Object.entries()为您提供了一个数组数组,其中每个数组都是[key, value]Object.values()只会为您提供一系列值。

最后,为确保合作伙伴合适,您可以使用partner.filter()仅过滤好的合作伙伴和不良合作伙伴。

将其中一些放在一起,您可以轻松地执行以下操作:

const total = Object.entries(capabilties.type).reduce(([key, type]) => {
  typeNumber = parseInt(type);
  const good = partners.filter(partner => key === partner.value.type && partner.value.isAvailable && appropriatePartners[key] < typeNumber);

  appropriatePartners[key].concat(good);

  if (appropriatePartners[key].length < typeNumber) {
    throw new Error('No appropriate partners');
  }

  return typeNumber;
}, 0);

if (total === 0) {
  throw new Error('Please mention at least 1 type of browser');
}

当然,这不是唯一合适的。我不知道你的逻辑中哪些是简单的,所以你可以跟踪它们,并且它们背后有商业逻辑。使用我提到的一些功能,如果你不需要跟踪某些事情,你可以进一步减少它。