我不仅在StackOverflow上搜索了高低搜索,而且在网络上其他地方搜索了很多其他地方。我已经尝试了一切,但我的逻辑从根本上存在缺陷。我很抱歉引入了另一个"数组中的重复项"问题,但我被困住了,似乎没有什么按预期工作。
无论如何,我有一个多维 JavaScript 数组,只有 2 级深。
var array = [[Part #, Description, Qty:],
[Part #, Description, Qty:],
[Part #, Description, Qty:]]; //etc
我需要做的是创建一个搜索array
并返回任何重复的"Part #"行的函数。当它们被返回时,我希望返回整个内部数组,包括描述和数量。
这样做的诀窍是,符合"重复"条件的部分#会以不同的方式结束(特别是最后4个字符),因此使用String.prototype.substr
是有意义的(对我来说)。
数组中以我正在寻找的方式存在重复项,所以我知道如果我有解决方案,它会返回那些 Part #。
以下是我迄今为止尝试过的方法,使我最接近解决方案:
function findDuplicateResults(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i][0].substr(0,5) === arr[++i][0].substr(0,5)) {
result.push(arr[i]);
}
}
return console.log(result);
}
我的想法是,如果数组(带有 substr(0,5) 的元素等于行中的下一个元素,则将其推送到结果数组。我也需要那里的另一个副本。代码的要点是仅显示带有 substr(0,5) 的重复。
我尝试使用高阶函数,例如map,forEach,reduce和filter(过滤器是让我难以置信为什么它不做我想要的函数),但我只能以这种方式返回[]
或整个数组。我用于上述高阶函数的逻辑保持不变(这可能是这里的问题)。
我希望我的if
状况是问题最多的。任何指示或解决方案都非常感谢。
您的代码中存在错误。当你使用 ++i
时,你正在更改 i
的值,因此它将在下一次迭代中跳过一个项目。
关于逻辑,你只是将一个项目与下一个项目进行比较,而实际上你应该将每个项目与所有项目进行比较:
function findDuplicateResults(arr) {
var result = [];
for (var i = 0; i <= arr.length - 1; i++) {
for (var k = 0; k <= arr.length - 1; k++) {
if (i !== k && arr[i][0].substr(0,5) === arr[k][0].substr(0,5)) {
result.push(arr[i]);
}
}
}
return result;
}
虽然,可以删除"substr",而"for"循环可以用高阶函数代替:
function findDuplicateResults(arr) {
return arr.filter(function(item1){
return arr.filter(function(item2){
return item1[0] === item2[0];
}).length > 1;
});
}