How can I create every combination possible for the contents of two arrays?

前端 未结 10 1357
南旧
南旧 2020-11-27 20:44

I have two arrays:

var array1=[\"A\",\"B\",\"C\"];

var array2=[\"1\",\"2\",\"3\"];

How can I set another array to contain every combinatio

相关标签:
10条回答
  • 2020-11-27 21:42

    Part II: After my complicated iterative "odometer" solution of July 2018, here's a simpler recursive version of combineArraysRecursively()...

    function combineArraysRecursively( array_of_arrays ){
    
            // First, handle some degenerate cases...
    
            if( ! array_of_arrays ){
                // Or maybe we should toss an exception...?
                return [];
            }
    
            if( ! Array.isArray( array_of_arrays ) ){
                // Or maybe we should toss an exception...?
                return [];
            }
    
            if( array_of_arrays.length == 0 ){
                return [];
            }
    
            for( let i = 0 ; i < array_of_arrays.length; i++ ){
                if( ! Array.isArray(array_of_arrays[i]) || array_of_arrays[i].length == 0 ){
                    // If any of the arrays in array_of_arrays are not arrays or are zero-length array, return an empty array...
                    return [];
                }
            }
    
            // Done with degenerate cases...
            let outputs = [];
    
            function permute(arrayOfArrays, whichArray=0, output=""){
    
                arrayOfArrays[whichArray].forEach((array_element)=>{
                    if( whichArray == array_of_arrays.length - 1 ){            
                        // Base case...
                        outputs.push( output + array_element );
                    }
                    else{
                        // Recursive case...
                        permute(arrayOfArrays, whichArray+1, output + array_element );
                    }
                });/*  forEach() */
            }
    
            permute(array_of_arrays);
    
            return outputs;
            
    
    }/* function combineArraysRecursively() */
    
    const array1 = ["A","B","C"];
    const array2 = ["+", "-", "*", "/"];
    const array3 = ["1","2"];
    
    console.log("combineArraysRecursively(array1, array2, array3) = ", combineArraysRecursively([array1, array2, array3]) );

    0 讨论(0)
  • 2020-11-27 21:43

    Assuming you're using a recent web browser with support for Array.forEach:

    var combos = [];
    array1.forEach(function(a1){
      array2.forEach(function(a2){
        combos.push(a1 + a2);
      });
    });
    

    If you don't have forEach, it is an easy enough exercise to rewrite this without it. As others have proven before, there's also some performance advantages to doing without... (Though I contend that not long from now, the common JavaScript runtimes will optimize away any current advantages to doing this otherwise.)

    0 讨论(0)
  • 2020-11-27 21:43

    Seeing a lot of for loops in all of the answers...

    Here's a recursive solution I came up with that will find all combinations of N number of arrays by taking 1 element from each array:

    const array1=["A","B","C"]
    const array2=["1","2","3"]
    const array3=["red","blue","green"]
    
    const combine = ([head, ...[headTail, ...tailTail]]) => {
      if (!headTail) return head
    
      const combined = headTail.reduce((acc, x) => {
        return acc.concat(head.map(h => `${h}${x}`))
      }, [])
    
      return combine([combined, ...tailTail])
    }
    
    console.log('With your example arrays:', combine([array1, array2]))
    console.log('With N arrays:', combine([array1, array2, array3]))

    0 讨论(0)
  • 2020-11-27 21:45

    I had a similar requirement, but I needed get all combinations of the keys of an object so that I could split it into multiple objects. For example, I needed to convert the following;

    { key1: [value1, value2], key2: [value3, value4] }
    

    into the following 4 objects

    { key1: value1, key2: value3 }
    { key1: value1, key2: value4 }
    { key1: value2, key2: value3 }
    { key1: value2, key2: value4 }
    

    I solved this with an entry function splitToMultipleKeys and a recursive function spreadKeys;

    function spreadKeys(master, objects) {
      const masterKeys = Object.keys(master);
      const nextKey = masterKeys.pop();
      const nextValue = master[nextKey];
      const newObjects = [];
      for (const value of nextValue) {
        for (const ob of objects) {
          const newObject = Object.assign({ [nextKey]: value }, ob);
          newObjects.push(newObject);
        }
      }
    
      if (masterKeys.length === 0) {
        return newObjects;
      }
    
      const masterClone = Object.assign({}, master);
      delete masterClone[nextKey];
      return spreadKeys(masterClone, newObjects);
    }
    
    export function splitToMultipleKeys(key) {
      const objects = [{}];
      return spreadKeys(key, objects);
    }
    
    0 讨论(0)
提交回复
热议问题