我试图获取一个数组,并将该数组的每个值与数组中的下一个值进行比较。当我运行我的代码时,应该与多个数组匹配的组件只返回一个匹配,而不是所有匹配。我可能在某处做错了什么,但对于我的生活,我似乎无法弄明白。
这是我的代码:
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项结合使用
提前感谢您的帮助。
答案 0 :(得分:0)
Array.prototype.slice
执行浅拷贝。
minterms
中的每个条目都是一个字符串数组和一个嵌套数组。
当您对条目进行切片时,您将获得一个新数组,其中包含该字符串的副本和Array对象引用的副本。但是,Array引用的副本仍指向minterms
元素中包含的数组。
更新嵌套数组时
newMin[match][1][loc] = "-";
您正在更新输入中的嵌套数组。我从来没有理解你正在做的事情的逻辑,但我相信这是问题,克隆输入数组元素时克隆嵌套数组的解决方案也是如此。
您可能希望解决的第二个问题是并非所有变量都已声明:var x,y,h;
或等效的内联声明丢失。
答案 1 :(得分:0)
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;
有一种更好的方法(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,那就是匹配。
我为你准备了这样的解决方案。它接近你的用例。我没有在输出中使用有趣的破折号样式,因为不属于您的问题。