将数组与其他数组合并,推送每个组合Javascript

时间:2018-02-18 21:30:36

标签: javascript arrays compare

我试图获取一个数组,并将该数组的每个值与数组中的下一个值进行比较。当我运行我的代码时,应该与多个数组匹配的组件只返回一个匹配,而不是所有匹配。我可能在某处做错了什么,但对于我的生活,我似乎无法弄明白。

这是我的代码:

INPUT

minterms = [["4",[0,1,0,0]],
           ["8",[1,0,0,0]],
           ["9",[1,0,0,1]],
           ["10",[1,0,1,0]],
           ["12",[1,1,0,0]],
           ["11",[1,0,1,1]],
           ["14",[1,1,1,0]],
           ["15",[1,1,1,1]]];

功能

function combineMinterms(minterms) {
var match = 0;
var count;
var loc;
var newMin = [];
var newMiny = [];
var used = new Array(minterms.length);

//First Component
for (x = 0; x < minterms.length; x++) {
if(minterms[x][1][minterms[x][1].length - 1] == "*") {
  newMin.push(minterms[x].slice());
  continue;
};
  //Second Component
  for (y = x + 1; y < minterms.length; y++) {
  count = 0;
    //Compare each value
    for (h = 0; h < minterms[x][1].length; h++) {
      if (minterms[x][1][h] != minterms[y][1][h]) {
      count++;
      loc = h;
      }
      if (count >= 2) {break; };
    }
    //If only one difference, push to new
    if (count === 1) {
      newMin.push(minterms[x].slice());
      newMiny = minterms[y].slice();
      newMin[match][1][loc] = "-";
      while(newMin[match][0].charAt(0) === 'd') {
        newMin[match][0] = newMin[match][0].substr(1);
      }
      while(newMiny[0].charAt(0) === 'd') {
        newMiny[0] = newMiny[0].substr(1);
      }
      newMin[match][0] += "," + newMiny[0];
      used[x] = 1;
      used[y] = 1;
      match++;
      continue;
    }
}
  //If never used, push to new
  if(used[x] != 1) {
    newMin.push(minterms[x].slice());
    newMin[match][1].push("*");
    match++;
  }
}
 return newMin; 
}

所需输出

newMin = [["4,12",[-,1,0,0]],
         ["8,9",[1,0,0,-]],
         ["8,10",[1,0,-,0]],
         ["8,12",[1,-,0,0]],
         ["9,11",[1,0,-,1]],
         ["10,11",[1,0,1,-]],
         ["10,14",[1,-,1,0]],
         ["12,14",[1,1,-,0]],
         ["11,15",[1,-,1,1]],
         ["14,15",[1,1,1,-]]];

它将第8项与第9项结合,但不会继续将第8项与10项结合使用

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

Array.prototype.slice执行浅拷贝。

minterms中的每个条目都是一个字符串数组和一个嵌套数组。

当您对条目进行切片时,您将获得一个新数组,其中包含该字符串的副本和Array对象引用的副本。但是,Array引用的副本仍指向minterms元素中包含的数组。

更新嵌套数组时

newMin[match][1][loc] = "-";

您正在更新输入中的嵌套数组。我从来没有理解你正在做的事情的逻辑,但我相信这是问题,克隆输入数组元素时克隆嵌套数组的解决方案也是如此。

您可能希望解决的第二个问题是并非所有变量都已声明:var x,y,h;或等效的内联声明丢失。

答案 1 :(得分:0)

&#13;
&#13;
let minterms = [4,8,9,10,12,11,14,15];
let newMin = [];

minterms.map((value, index) =>{
  minterms.reduce((accumulator, currentValue, currentIndex, array) => {
      accumulator = value;
      let out = (accumulator ^ currentValue).toString(2);
     if(out.split('').filter(n=>n==="1").length == 1) newMin.push([value, currentValue]);
}, value);
});

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

有一种更好的方法(10行代码)。由于您正在使用二进制表示,因此您可能需要考虑使用BitWise运算符。当与数组运算符结合使用时,它可以直接实现这一目标。

例如:

给定匹配意味着两个二进制数之间只有一位不同:

按位XOR运算符为每个不匹配的位返回1。所以:

0100 XOR 1000 results in 1000

现在,我们需要计算&#39; 1&#39;返回的二进制数字中的数字。我们可以使用数组的length属性来执行此操作。要将1000转换为数组,首先我们将二进制转换为字符串:

可以使用以下方法轻松检索整数4的二进制表示形式:

num.toString(2)

因此,如果num === 4,则上面的输出是字符串&#34; 0100&#34;。

现在我们使用str.split()将字符串转换为数组。从数组中删除不是&#39; 1&#39;的所有内容。现在只需获取length属性即可。如果长度=== 1,那就是匹配。

我为你准备了这样的解决方案。它接近你的用例。我没有在输出中使用有趣的破折号样式,因为不属于您的问题

https://jsbin.com/xezuwax/edit?js,console