首页 > 解决方案 > 根据多个条件减少数组

问题描述

我的任务是根据最多以下三个条件减少对象数组:

  1. 根据用户语言从数组中返回一个对象,例如ru_RU.
  2. 如果未提供用户语言,则根据应用程序默认语言返回对象,en_EN.
  3. 如果未提供用户语言,并且数组没有与默认应用程序语言对应的对象,则返回数组中的第一个对象。

下面是一个数组示例:

[
  {
    "id":1,
    "language":{
      "id":1,
      "isoCode":"en_GB"
    }
  },
  {
    "id":2,
    "language":{
      "id":2,
      "isoCode":"es_ES"
    }
  },
  {
    "id":3,
    "language":{
      "id":3,
      "isoCode":"ru_RU"
    }
  },
  {
    "id":4,
    "language":{
      "id":4,
      "isoCode":"fr_FR"
    }
  }
]

这是一个有效的解决方案:

const [userLanguageMessage] = data.filter(
    (message) => message.language.isoCode === USER_LANGUAGE,
);
const [defaultLanguageMessage] = data?.filter(
    (message) => message.language.isoCode === DEFAULT_LANGUAGE,
);
const [firstLanguageMessage] = data;
const message = userLanguageMessage || defaultLanguageMessage || firstLanguageMessage;

我想让它更整洁,可以这么说,想知道我是否可以使用 reduce 来实现它。

标签: javascriptarraysloopsreduce

解决方案


有了这个给定的结构,这样的东西应该可以工作

result = 
    data.find(x => x.language.isoCode === userLanguage) ||
    data.find(x => x.language.isoCode === 'en_US') ||
    data[0]

或更有效的方式:

function get(data, lang) {
    let def = null;
 
    for (let x of data) {
        if (x.language.isoCode === lang)
            return x;
        if (x.language.isoCode === 'en_US')
            def = x;
    }
    
    return def || data[0]
}

但你应该真的Map为此使用查找。

作为旁注,我一直想知道有什么特别之处reduce以至于人们觉得有必要使用它。


推荐阅读