Ich wollte eine Funktion schreiben, um ein zusammenhängendes Subarray innerhalb eines gegebenen Arrays von einem gegebenen Startindex zu finden und den Index des Subarrays innerhalb des Arrays zurückzugeben, wenn es gefunden wird, und -1, wenn es nicht gefunden wird. Dies ist vergleichbar mit String.indexOf
, aber für Arrays und Subarrays anstelle von Strings und Substrings.Elegante Möglichkeit, zusammenhängendes Subarray innerhalb eines Arrays in JavaScript zu finden?
Das ist mein Arbeitscode:
var find_csa = function (arr, subarr, from_index) {
if (typeof from_index === 'undefined') {
from_index = 0;
}
var i, found, j;
for (i = from_index; i < 1 + (arr.length - subarr.length); ++i) {
found = true;
for (j = 0; j < subarr.length; ++j) {
if (arr[i + j] !== subarr[j]) {
found = false;
break;
}
}
if (found) return i;
}
return -1;
};
Und das sind meine Tests und ihre erwarteten Werte:
console.log(find_csa([1, 2, 3, 4, 5], [2, 3, 4]) === 1);
console.log(find_csa([1, 2, 3, 4, 5], [5]) === 4);
console.log(find_csa([1, 2, 3, 4, 5], [1, 3]) === -1);
console.log(find_csa([1, 2, 3, 4, 5], [42]) === -1);
console.log(find_csa([1, 2, 3, 4, 5], []) === 0);
console.log(find_csa([3, 4, 3, 4, 3, 4], [3, 4, 3], 1) === 2);
console.log(find_csa([6, 6, 6, 7], [6, 6, 7]) === 1);
console.log(find_csa([12, 9, 16, 42, 7, 866, 3], [16, 42, 7, 866]) === 2);
Mein Code die Tests besteht, aber wie Sie sehen können, verwendet es einen boolean Wert found
in der inneren Schleife, die nur meine unordentliche, Ad-hoc-Möglichkeit der Fortsetzung einer äußeren Schleife aus einer verschachtelten Schleife ist. Gibt es eine sauberere Art, es zu schreiben? Ich schaute in Array.prototype.findIndex
, aber es ist eine experimentelle Technologie im Moment, so dass ich es nicht verwenden kann. Ich möchte eine Methode, die in den meisten Browsern funktioniert. Ich weiß, dass auf der Mozilla-Seite ein "Polyfill" -Code-Snippet geschrieben ist, aber das ist sogar länger als mein aktueller Code und wird aufgrund der Funktionsaufrufe langsamer sein, also würde ich es lieber vermeiden.
Mein primäres Ziel für diese Funktion ist Leistung (der Sub-Arrays sehr klein sein, so dass ich glaube, dass Boyer-Moore string search algorithm oder tries mit einem bisschen übertrieben ist), und dann mein zweites Ziel ist Eleganz meiner Umsetzung. Mit diesen zwei Zielen möchte ich wissen, ob es eine bessere Möglichkeit gibt, diesen Code zu schreiben, oder ob es irgendwelche JavaScript-Funktionen oder -Funktionen gibt, die mir fehlen, die mir helfen könnten, den booleschen Wert zu vermeiden.
JSFiddle, wenn es hilft jemand: http://jsfiddle.net/qc4zxq2p/
Was 1. 'JSON.stringify' 2.' array.prototype.slice' – zerkms
nicht mit 'kommen sie ''' aber kommen mit ',' stattdessen. String.indexOf würde immer noch funktionieren, aber es wird vermeiden, '[2,11,5]' und '[21,15]' als dasselbe zu interpretieren – slebetman
@zerkms, ich könnte JSON.stringify sehen, wenn es darum geht, die Existenz eines zusammenhängenden Objekts zu finden Subarray, aber wissen Sie, wie Sie seinen Index abrufen würden? Ich nehme an, Sie müssten sich auf Kommas oder etwas trennen. Aber dann würden Sie wieder auf Platz 1 sein. Bei Ihrer Nummer-2-Methode kann ich nicht erkennen, wie "Array.prototype.slice" helfen würde. Ich verstehe, dass Sie es verwenden können, um Zeichenfolgen in Arrays zu konvertieren, die "Anruf" verwenden, aber das ist nicht das Problem. – Shashank