Javascript - Generating all combinations of elements in a single array (in pairs)

后端 未结 9 642
天命终不由人
天命终不由人 2020-11-28 11:14

I\'ve seen several similar questions about how to generate all possible combinations of elements in an array. But I\'m having a very hard time figuring out how to write an a

9条回答
  •  半阙折子戏
    2020-11-28 11:53

    I ended up writing a general solution to this problem, which is functionally equivalent to nhnghia's answer, but I'm sharing it here as I think it's easier to read/follow and is also full of comments describing the algorithm.

    
    /**
     * Generate all combinations of an array.
     * @param {Array} sourceArray - Array of input elements.
     * @param {number} comboLength - Desired length of combinations.
     * @return {Array} Array of combination arrays.
     */
    function generateCombinations(sourceArray, comboLength) {
      const sourceLength = sourceArray.length;
      if (comboLength > sourceLength) return [];
    
      const combos = []; // Stores valid combinations as they are generated.
    
      // Accepts a partial combination, an index into sourceArray, 
      // and the number of elements required to be added to create a full-length combination.
      // Called recursively to build combinations, adding subsequent elements at each call depth.
      const makeNextCombos = (workingCombo, currentIndex, remainingCount) => {
        const oneAwayFromComboLength = remainingCount == 1;
    
        // For each element that remaines to be added to the working combination.
        for (let sourceIndex = currentIndex; sourceIndex < sourceLength; sourceIndex++) {
          // Get next (possibly partial) combination.
          const next = [ ...workingCombo, sourceArray[sourceIndex] ];
    
          if (oneAwayFromComboLength) {
            // Combo of right length found, save it.
            combos.push(next);
          }
          else {
            // Otherwise go deeper to add more elements to the current partial combination.
            makeNextCombos(next, sourceIndex + 1, remainingCount - 1);
          }
            }
      }
    
      makeNextCombos([], 0, comboLength);
      return combos;
    }
    
    

提交回复
热议问题