【问题标题】:How do you merge certain items in a JavaScript array?如何合并 JavaScript 数组中的某些项目?
【发布时间】:2019-07-15 16:03:07
【问题描述】:

假设你有以下数组:

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

您将如何更改此数组以使所有“b”项组合在一起,直到您点击另一个“a”。

所以上面数组的结果应该是这样的:

['a', 'a', 'bbb', 'a', 'bb', 'a'];

我正在尝试解决一个问题,即在与 React 应用程序中的模式匹配的单词周围包裹 span 标签,但这本质上是我的问题。

我已经为此工作了很长时间,但无法提出任何令我满意的事情。

有什么想法吗?

干杯。

【问题讨论】:

  • 模式是什么?
  • 为什么前两个a没有合并?
  • @adiga 他说他想组 b 的
  • 我最初打错了所需的输出,请参阅编辑后的回复。

标签: javascript arrays sorting ecmascript-6


【解决方案1】:

你可以stringify你的数组然后用b或更多或任何其他字符的匹配来分割它

const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];

const res = ab.join("").match(/(b{1,}|.)/g);

console.log(res)

【讨论】:

    【解决方案2】:

    您可以只映射ab数组,如果当前元素是a,则将其推送到新数组,但如果当前元素是b,则检查前一个元素是否为b ,如果是,则将当前元素合并到前一个元素,否则只需将 b 推送到新数组。

    const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];
    
    let arr = [];
    
    ab.map((e,i) => {
      if(i > 0) { // check if element is the first one or not
        if(e == "b") { 
          if(ab[i - 1].indexOf('b') > -1) { // check if prev element is "b" or not
          	arr[arr.length-1] += e; // merge if prev element is "b"
          } else {
          	arr.push(e);
          }
        } else {
          arr.push(e);
        }
      } else {
      	arr.push(e);
      }
    });
    
    console.log(arr);

    注意与上面显示的map() 方法方法相比,其他答案中显示的reduce() 方法方法和regex 方法更简洁。

    【讨论】:

      【解决方案3】:

      如果您只想合并b,那么您可以像这样使用reduce

      如果当前项和上一项都是b,则将其附加到最后一个累加器项。否则,将其推入累加器

      const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a']
      
      const output = ab.reduce((acc, c, i, arr) => {
        arr[i-1] === "b" && c === "b" 
          ? acc[acc.length - 1] += c
          : acc.push(c)
          
        return acc;
      },[])
      
      console.log(output)

      【讨论】:

        【解决方案4】:

        假设元素总是单个字母,您可以合并元素,然后匹配bs 或非bs:

        ab.join('').match(/(b+|.)/g)
        

        const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];
        
        let output = ab.join('').match(/(b+|.)/g);
        
        console.log(output);

        【讨论】:

          【解决方案5】:

          计算重复出现次数,然后基于此构建结果:

           const result = [];
           let curr = array[0], count = 1;
          
           for(const el of array.slice(1).concat(undefined)) {
             if(el !== curr || el !== "b") {
               result.push(curr.repeat(count));
               curr = el, count = 1;
             } else count++;
           }
          

          【讨论】:

          • 为什么是子字符串?你会把'boo'和其他'b'放在一起吗?
          • @paulpro 否则bb 不会再次与b 分组......但你是对的,没有想到boo
          【解决方案6】:

          这就是你所追求的:

          var ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];
          
          var index = 0;
          var groupedArray = [];
          var firstOccurence = true;
          var groupedString = "";
          var grouping = false;
          for (var a = 0; a < ab.length; a++) {
          
            if (ab[a] == "a") {
              if (grouping) {
                grouping = false;
                firstOccurence = true;
                groupedArray.push(groupedString);
              }
              groupedArray.push(ab[a]);
            } else {
              if (firstOccurence) {
                groupedString = "";
                firstOccurence = false;
              }
              groupedString += ab[a];
              grouping = true;
            }
          }
          console.log(groupedArray);

          【讨论】:

            【解决方案7】:

            我不知道如何解释,但使用 reduce 你可以这样做:

            const ab = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];
            
            function merge(arr) {
              return arr.reduce((acc,cur, index) => {
                if(arr[index - 1] === 'b' && cur !== 'a') {
                  acc[acc.length - 1] = acc[acc.length - 1] + cur;
                  return acc;
                }
                acc.push(cur);
                return acc;
              },[]);
            }
            
            console.log(merge(ab))

            【讨论】:

              【解决方案8】:

              使用Array#reduce 你可以做这样的事情。

              我假设您的解决方案中的前两个字符是错字。

              const data = ['a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'a'];
              
              const res = data
              .reduce((a,c)=>{
                const lastIndex = a.length - 1;
                if(a[lastIndex] && a[lastIndex].includes('b') && c === 'b') a[lastIndex] += c;
                else a.push(c);
                return a;
              }, []);
              
              console.log(res);

              【讨论】:

                猜你喜欢
                • 2018-12-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-12-26
                • 1970-01-01
                • 2011-03-24
                相关资源
                最近更新 更多