将数组内的每个数字与其他数字配对,不包括重复或反向对

时间:2018-01-22 20:45:41

标签: javascript arrays combinations

我有3个输入,每个输入3位数。然后我的代码将所有数字组合成1个数组。在这种情况下[1,2,3,4,5,6,7,8,9]。我只想输出从第一个数字开始的每一对,不包括双位数,重复对或反转对。所以我希望它看起来像:

12

13

14 etc

但如果12已经是数组中的一对,则不会添加21。 (反对)。不会添加像55这样的双位数字以及重复对(任何一对都不会输入两次)。

关于我应该采取的方向的任何想法?



var button = document.querySelector( 'button' );
button.addEventListener( 'click', clicked );

function clicked() {
	var output = document.getElementById( 'output' );
  
  var first = document.getElementById( 'first' );
  var second = document.getElementById( 'second' );
  var third = document.getElementById( 'third' );
  
  var first = first.value.split( '' );
  var second = second.value.split( '' );
  var third = third.value.split( '' );
  
  var numGroup = first.concat( second );
  numGroup = numGroup.concat( third );
  
  //alert( numGroup );
  
  output.innerHTML = '';
  
  var i = 0;
  var j = 0;
  
  for( i; i < numGroup.length; i++ ){
  	for( j; j < numGroup.length; j++ ){
  		output.innerHTML += numGroup[ i ] + numGroup[ j ] + '<br>';
  	}
  }
}
&#13;
* {
  box-sizing: border-box;
}
html {
  font-family: Arial;
  letter-spacing: 0.1rem;
}
.controls {
  display: flex;
}
input {
  font-size: 2rem;
  letter-spacing: 0.125rem;
  padding: 0.5rem;
  width: 4.75rem;
  margin-right: 1rem;
}
button {
  height: 4.5rem;
  width: 4.75rem;
  text-transform: uppercase;
  padding: 8px;
  background: black;
  border: none;
  color: white;
  cursor: pointer;
}
button:hover {
  outline-color: aqua;
  outline-width: 2px;
  outline-style: solid;
  outline-offset: 1px;
}
.output {
  background-color: #eee;
  padding: 1rem;
  margin-top: 1rem;
  width: 22rem;
}
&#13;
<div class="controls">
  <input type="text" maxlength="3" id="first" value="123">
  <input type="text" maxlength="3" id="second" value="456">
  <input type="text" maxlength="3" id="third" value="789">
  <button>submit</button>
</div>

<div class="output" id="output">
  output
</div>
&#13;
&#13;
&#13;

编辑:据我所知,这是关于可能的组合而非排列的问题。

1 个答案:

答案 0 :(得分:0)

如果我理解了这个问题,那么对于数组中的每个项目,您都希望将其与后面的所有项目配对。这避免了重复对(包括反向对)以及双重对象。

为此,您可以使用.reduce()将结果数组放在一起。在每次迭代中,您将获得当前数字,然后您只需要将当前索引前的一个原始数组切片,以获得应该与之配对的所有数组。

所以你在当前索引之后获取子切片,你.map(),返回外部数字与.map()回调中当前索引的配对,并将映射的数组连接到.reduce结果。

所有这些只需要几行代码。

&#13;
&#13;
const arr = [1,2,3,4,5,6,7,8,9];

const res = arr.reduce((res, n, i, arr) =>
  res.concat(arr.slice(i+1).map(nn => "" + n + nn))
, [])

console.log(res);
&#13;
&#13;
&#13;

对于明确的要求,请尽早消除原始数据集中的任何重复项。您可以在评论中使用 trincot 提供的示例。

&#13;
&#13;
const arr = [...new Set([1,2,3,4,5,5,6,3,7,8,9])];

const res = arr.reduce((res, n, i, arr) =>
  res.concat(arr.slice(i+1).map(nn => "" + n + nn))
, []);

String.prototype.reverse = function() {   this.split("").reverse().join("")
}

console.log("No doubles, dupes or reverse dupes?", 
  res.every(s =>
    res.indexOf(s) === res.lastIndexOf(s) &&
    res.indexOf(s.reverse()) === -1 &&
    s !== s.reverse()
  )
);

console.log(res);
&#13;
&#13;
&#13;