代码之家  ›  专栏  ›  技术社区  ›  Vladimir Humeniuk

根据值中的文本将数组拆分为小数组

  •  0
  • Vladimir Humeniuk  · 技术社区  · 7 年前

    我有一个大数组,看起来像这个例子:

    let array = ['aa-we', 'aa-we__qq', 'aa-we__qw', 'gsPlsOdd', 'bc-po-lp', 'bc-po-lp--ps', 'de', 'de__io', 'de__sl', 'de--xz', 'ccsDdd'];
    

    我希望按值将此数组拆分为小数组:

    let array = [
      ['aa-we', 'aa-we__qq', 'aa-we__qw'],
      ['bc-po-lp', 'bc-po-lp--ps'],
      ['de', 'de__io', 'de__sl', 'de--xz']  
    ]
    
    // and camelcase strings should be removed 
    

    数组中的值具有与bem选择器类似的语法,因此如果不同字符串的前缀相同,则应将它们包装在单个数组中。

    如果可能的话,如果没有附加的库,我该怎么做?

    感谢您的帮助或提示!

    3 回复  |  直到 7 年前
        1
  •  3
  •   yunzen    7 年前

    console.clear()
    let data = [
      "aa-we",
      "aa-we__qq",
      "aa-we__qw",
      "gsPlsOdd",
      "bc-po-lp",
      "bc-po-lp--ps",
      "de",
      "de__io",
      "de__sl",
      "de--xz",
      "ccsDdd",
    ];
    
    
    resultO = data.reduce((acc, val, idx) => {
      if (val.match(/[A-Z]/)) {return acc;}
      const sel = val.replace(/^(.*)(__|--).*$/g, "$1");
      acc[sel] = acc[sel] || [];
      acc[sel].push(val)
      return acc;
    }, {})
    resultA = Object.values(resultO)
    
    console.log(resultA)
        2
  •  3
  •   James Coyle    7 年前

    我会这样做,然后过滤掉你不想要的东西。

    let array = ['aa-we', 'aa-we__qq', 'aa-we__qw', 'gsPlsOdd', 'bc-po-lp', 'bc-po-lp--ps', 'de', 'de__io', 'de__sl', 'de--xz', 'ccsDdd'];
    
    array = array.filter((a) => !a.match(/[A-Z]/))
    
    let result = groupBy(array, (str)=> str.split(/[-_]/)[0])
    
    console.log(Object.values(result))
    
    function groupBy(arr, condition) {
      return arr.reduce((result, current) => {
        const key = condition(current);
        (result[key] || (result[key] = [])).push(current)
        return result
      }, {})
    }
        3
  •  2
  •   RobC Manuel Gonzalez    7 年前

    算法如下:

    1. 创造 Map<Prefix,ValuesArray>
    2. 对于数组中的每个元素:
      • 获取前缀,例如“ab”,如果无效则跳过元素(例如不存在前缀或camel case)
      • 添加到相应的哈希桶
    3. 联接来自的值 Map 成一阵

    JS有所有的原语来实现这一点,只需查看用于散列和数组的map/object( map / filter / reduce )用于处理。