【问题标题】:Javascript - Optimized way to extract a subset of elements from an array, based on specific criteriaJavascript - 基于特定标准从数组中提取元素子集的优化方法
【发布时间】:2020-02-25 09:18:00
【问题描述】:

给定一个标签数组,我想提取那些以不同数组中指定的关键字开头的值。

输入: 两个数组 - labelskeys

需要的输出:

labels 数组中的所有值以 keys 数组中的任何值开头

我已经尝试过的:

    const keys= ['activity', 'admin'];
    const labels = ["accountTypes.GROUP_ACCOUNT",
    "accountTypes.SINGLE_ACCOUNT",
    "activity.active",
    "activity.inactive",
    "admin.dictionaries.name",
    "admin.group.details.addedDate",
    "admin.group.details.enterDescription"];

    let arr = [];
    keys.forEach( key => {
      labels.forEach(label => {
        if (label.indexOf(key) === 0){
          arr.push(label);
        }
      });
    });

    console.log(arr)

需要帮助:

我想在没有indexOf() 的情况下重构这段代码并删除无用的 groupArr。我想使用 ^ES6 或/和 lodash

【问题讨论】:

  • 你到底想返回什么?

标签: javascript lodash


【解决方案1】:

您可以使用函数filter 和函数includes 来过滤所需的元素/字符串。

const keys = ['activity', 'admin'];
const labels = ["accountTypes.GROUP_ACCOUNT","accountTypes.SINGLE_ACCOUNT","activity.active","activity.inactive","admin.dictionaries.name","admin.group.details.addedDate","admin.group.details.enterDescription"];

let arr = labels.filter(l => {
  let [label] = l.split(".");
  return keys.includes(label);
});
console.log(arr)

【讨论】:

  • labels.filter(l => keys.includes(l.substring(0,l.indexOf('.'))))
【解决方案2】:

可以使用filter方法提取数组的子集。

filter 方法采用一个返回布尔值的函数作为输入。 布尔函数可以包含比较逻辑。

这是从“keys”数组中提取以文本开头的“labels”数组值的有效解决方案:

// File name: array-subset.js

const keys= ['activity', 'admin']

const labels = ["accountTypes.GROUP_ACCOUNT",
    "accountTypes.SINGLE_ACCOUNT",
    "activity.active",
    "activity.inactive",
    "admin.dictionaries.name",
    "admin.group.details.addedDate",
    "admin.group.details.enterDescription"]


// Function to be used as the input for 'filter' method

function matchedValue(label) {
        return keys.includes(label.split(".")[0])
}


console.log(labels.filter(matchedValue))

输出:

$ node array-subset.js 
[ 'activity.active',
  'activity.inactive',
  'admin.dictionaries.name',
  'admin.group.details.addedDate',
  'admin.group.details.enterDescription' ]

【讨论】:

    【解决方案3】:

    你可以使用lodash的difference、differenceWith和includes

    const keys= ['activity', 'admin'];
        const labels = ["accountTypes.GROUP_ACCOUNT",
        "accountTypes.SINGLE_ACCOUNT",
        "activity.active",
        "activity.inactive",
        "admin.dictionaries.name",
        "admin.group.details.addedDate",
        "admin.group.details.enterDescription"];
    
       _.difference(labels,_.differenceWith(labels, keys,(label,key) => _.includes(label,key)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      相关资源
      最近更新 更多