如何比较两个数组然后return的索引之差?
How to compare two arrays and then return the index of the difference?
我有两个数组需要检查差异和 return 差异的索引。
例如,我目前有两个数组,它们会在输入值更改时更新。只要输入中有新标签,例如 @testing
,newTags
数组就会更新。我需要比较 newTags
数组与 oldTags
数组和 return 差异索引。
我目前正在对两个数组进行字符串化并以这种方式比较它们,尽管它无法 return 差异的索引。
var newTags = [];
var oldTags = [];
$input.on('keyup', function () {
var newValue = $input.val();
var pattern = /@[a-zA-Z]+/ig;
var valueSearch = newValue.search(pattern);
if (valueSearch >= 0) {
newTags = newValue.match(pattern);
if ((newTags + "") != (oldTags + "")) {
//Need index of difference here
console.log(newTags, oldTags);
}
oldTags = newTags;
}
});
for(var i=0; i < newTags.length; i++) {
for(var j=0; j < oldTags.length; j++) {
if(newTags[i] === oldTags[j]) {
console.log("match found");
console.log("Match found for value: " + newTags[i] + " at index in oldTags: " + j + );
}
else{
console.log("match not found");
}
}
}
使用 2 个循环你可以做一个快速检查,在 if 语句中添加你想要发生的事情。
您可以使用过滤器同时查找不同的值和索引。
JSFiddle:https://jsfiddle.net/k0uxtnkd/
Array.prototype.diff = function(a) {
var source = this;
return this.filter(function(i) {
if (a.indexOf(i) < 0) {
diffIndexes.push(source.indexOf(i));
return true;
} else {
return false;
}
});
};
var diffIndexes = [];
var newTags = ['a','b','c'];
var oldTags = ['c'];
var diffValues = newTags.diff(oldTags);
console.log(diffIndexes); // [0, 1]
console.log(diffValues); // ['a', 'b']
要将其转换为函数而不是将其添加到数组原型中:
JSFiddle:https://jsfiddle.net/k0uxtnkd/1/
function arrayDiff(a, b) {
return a.filter(function(i) {
if (b.indexOf(i) < 0) {
diffIndexes.push(a.indexOf(i));
return true;
} else {
return false;
}
});
};
var diffIndexes = [];
var newTags = ['a','b','c'];
var oldTags = ['c'];
var diffValues = arrayDiff(newTags, oldTags);
console.log(diffIndexes); // [0, 1]
console.log(diffValues); // ['a', 'b']
您不需要遍历两个数组,您可以简单地同时遍历两个数组:
var findDivergence = function (a1, a2) {
var result = [], longerLength = a1.length >= a2.length ? a1.length : a2.length;
for (i = 0; i < longerLength; i++){
if (a1[i] !== a2[i]) {
result.push(i);
}
}
return result;
};
console.log(findDivergence(["a","b","c","d","e","f","g","h","i"], ["a","b","d","r","e","q","g"]));
//outputs [2, 3, 5, 7, 8]
这比双循环或使用 indexOf(两者都会比必要的多次搜索第二个数组)更有效。这也处理了同一项目在给定数组中出现多次的情况,但如果一个数组比另一个长并且较长的数组包含未定义的元素,则该索引将被视为匹配项。
我有两个数组需要检查差异和 return 差异的索引。
例如,我目前有两个数组,它们会在输入值更改时更新。只要输入中有新标签,例如 @testing
,newTags
数组就会更新。我需要比较 newTags
数组与 oldTags
数组和 return 差异索引。
我目前正在对两个数组进行字符串化并以这种方式比较它们,尽管它无法 return 差异的索引。
var newTags = [];
var oldTags = [];
$input.on('keyup', function () {
var newValue = $input.val();
var pattern = /@[a-zA-Z]+/ig;
var valueSearch = newValue.search(pattern);
if (valueSearch >= 0) {
newTags = newValue.match(pattern);
if ((newTags + "") != (oldTags + "")) {
//Need index of difference here
console.log(newTags, oldTags);
}
oldTags = newTags;
}
});
for(var i=0; i < newTags.length; i++) {
for(var j=0; j < oldTags.length; j++) {
if(newTags[i] === oldTags[j]) {
console.log("match found");
console.log("Match found for value: " + newTags[i] + " at index in oldTags: " + j + );
}
else{
console.log("match not found");
}
}
}
使用 2 个循环你可以做一个快速检查,在 if 语句中添加你想要发生的事情。
您可以使用过滤器同时查找不同的值和索引。
JSFiddle:https://jsfiddle.net/k0uxtnkd/
Array.prototype.diff = function(a) {
var source = this;
return this.filter(function(i) {
if (a.indexOf(i) < 0) {
diffIndexes.push(source.indexOf(i));
return true;
} else {
return false;
}
});
};
var diffIndexes = [];
var newTags = ['a','b','c'];
var oldTags = ['c'];
var diffValues = newTags.diff(oldTags);
console.log(diffIndexes); // [0, 1]
console.log(diffValues); // ['a', 'b']
要将其转换为函数而不是将其添加到数组原型中: JSFiddle:https://jsfiddle.net/k0uxtnkd/1/
function arrayDiff(a, b) {
return a.filter(function(i) {
if (b.indexOf(i) < 0) {
diffIndexes.push(a.indexOf(i));
return true;
} else {
return false;
}
});
};
var diffIndexes = [];
var newTags = ['a','b','c'];
var oldTags = ['c'];
var diffValues = arrayDiff(newTags, oldTags);
console.log(diffIndexes); // [0, 1]
console.log(diffValues); // ['a', 'b']
您不需要遍历两个数组,您可以简单地同时遍历两个数组:
var findDivergence = function (a1, a2) {
var result = [], longerLength = a1.length >= a2.length ? a1.length : a2.length;
for (i = 0; i < longerLength; i++){
if (a1[i] !== a2[i]) {
result.push(i);
}
}
return result;
};
console.log(findDivergence(["a","b","c","d","e","f","g","h","i"], ["a","b","d","r","e","q","g"]));
//outputs [2, 3, 5, 7, 8]
这比双循环或使用 indexOf(两者都会比必要的多次搜索第二个数组)更有效。这也处理了同一项目在给定数组中出现多次的情况,但如果一个数组比另一个长并且较长的数组包含未定义的元素,则该索引将被视为匹配项。