Ich muss in der Lage sein, ein gemeinsames Element zwischen einer beliebigen Anzahl von Arrays zu finden. Zum Beispiel lassen Sie uns sagen, dass es ein Objekt wie folgt:Der effizienteste Weg, ein gemeinsames Objekt zwischen einer beliebigen Anzahl von Arrays zu finden
var obj = {
a: [ 15, 23, 36, 49, 104, 211 ],
b: [ 9, 12, 23 ],
c: [ 11, 17, 18, 23, 38 ],
d: [ 13, 21, 23, 27, 40, 85]
};
Ich brauche würde das gemeinsame Element zwischen jedem dieser Arrays zu bestimmen. (In diesem Fall 23).
Meine Lösung besteht darin, das kürzeste Array zu finden und jedes Element darin zu durchlaufen und den Index der anderen Arrays zu überprüfen.
var shortest = {};
var keys = [];
for (var key in obj) {
if (obj.hasOwnProperty(key) && Array.isArray(obj[ key ])) {
keys.push(key);
if (!shortest.hasOwnProperty('length') || obj[ key ].length < shortest.length) {
shortest.name = key;
shortest.length = obj[ key ].length;
}
}
}
var res = obj[ shortest.name ].filter(function (v) {
for (var i = 0; i < keys.length; i++) {
if (obj[ keys[ i ] ].indexOf(v) === -1) {
return false;
}
return true;
}
};
Dies scheint jedoch enorm ineffizient, und ich versuche, um zu bestimmen, ob es eine bessere Art und Weise ist, vorzugsweise ohne mehrmals durch die Dinge zu Schleife.
So sind alle beliebigen Arrays passieren in Ihrem Beispielcode sortiert werden. Ist das Zufall, oder ist es eine Tatsache? – Quirk
@Quik Happenstance. Ich glaube, dass die Datenquelle sortiert zurückkommt, aber ich zögere, darauf zu zählen. –
Wenn alle Arrays sortiert sind, ist die Worst-Case-Laufzeit wahrscheinlich linear in der Summe ihrer Größen, dh 'O (n1 + n2 + ...)' – Quirk