JavaScript将多维数组转换为唯一的项目数组

3
我将尝试提供一个算法,将任何多维数组转换为只包含唯一项的数组:
例子:
  var arr = [
       ["bananas", "oranges"],
       ["cars", "trucks", "airplanes"],
       ["Jim", "Bob", "David", "Diana"]
  ];

  // I need to create an array that will contain a unique record of each item in the array

  /*
  NEED TO OUTPUT TO
  newArr = [
       ["bananas", "cars", "Jim"],
       ["bananas", "cars", "Bob],
       ["bananas", "cars", "David],
       ["bananas", "cars", "Diana],
       ["bananas", "trucks", "Jim"],
       ["bananas", "trucks", "Bob],
       ["bananas", "trucks", "David],
       ["bananas", "trucks", "Diana],
       ["bananas", "airplanes", "Jim"],
       ["bananas", "airplanes", "Bob],
       ["bananas", "airplanes", "David],
       ["bananas", "airplanes", "Diana],  
       ["oranges", "cars", "Jim"],
       ["oranges", "cars", "Bob],
       ["oranges", "cars", "David],
       ["oranges", "cars", "Diana],
       ["oranges", "trucks", "Jim"],
       ["oranges", "trucks", "Bob],
       ["oranges", "trucks", "David],
       ["oranges", "trucks", "Diana],
       ["oranges", "airplanes", "Jim"],
       ["oranges", "airplanes", "Bob],
       ["oranges", "airplanes", "David],
       ["oranges", "airplanes", "Diana]
     ];
  */

上面只是一个例子。我需要这个算法处理任何大小的数组。目前我还没有进展太多。非常感谢您的帮助。
以下是我目前所拥有的 - 它几乎什么都不是,也不美观(顺便说一下-如果使用jQuery有帮助的话,我愿意尝试)。

function foo() {
  
  var arr = [
  ["bananas", "oranges"],
  ["cars", "trucks", "airplanes"],
  ["Jim", "Bob", "David", "Diana"]
];

  
  var i = 0, j = 0;
  
  //Define the containing array
  var newArr = [];
  
  //Used to calculate the total unique entries (24 in this example: 2 * 3 * 4)
  var totalObjects = 1;
  
  //Calculate total unique objects
  for (i = 0; i < arr.length; i++) {
    totalObjects *= arr[i].length;
  }
  
  //Identify the new array to contain 24 arrays each with 3 entries
  for (i = 0; i < totalObjects; i++) {
    newArr.push(new Array(arr.length));
  }
  
  
  for (i = 0; i < newArr.length; i++) {    
    for (j = 0; j < newArr[i].length; j++) {
      newArr[i][j] = arr[j][i];
    }    
  }
  
}

foo();


你的意思是要形成一个数组的数组,其中结果中的每个子数组(结果是一个数组)都是包含原始子数组中每个成员的唯一排列吗? - CSSBurner
是的,基本上就是这样。 - bagofmilk
正如David所说,看起来你想要排列而不是唯一项。 - andrewgi
jQuery不会有所帮助。它是用于DOM操作的,这里只需要纯JS即可。 - Jeremy Thille
1个回答

8

您可以使用reduce函数,将每个数组中的元素与其他数组中的元素收集在一起,然后返回结果。

var array = [["bananas", "oranges"], ["cars", "trucks", "airplanes"], ["Jim", "Bob", "David", "Diana"]],
    result = array.reduce(
        (a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), [])
    );
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接