2017-03-07 2 views
1

Wenn eine der choice Objekts von choices Array nicht in irgendeiner der results Array Verbergen choice Element in diesem Fall {"choice": "f"} und {"choice": "g"} ist nicht verfügbar, in einem dieser 3 Ergebnisse also muss ich es verstecken. Wie kann ich es tun?wie die Elemente von einem Array in einem anderen Array vergleichen

+1

was bedeutet * verstecken *? Brauchen Sie ein Array mit dem Ergebnis? –

+0

die Frage ist unklar, der gepostete Code ist nur ein Schnitt Stück Code mit keinem Anfang und Ende (gewählt, um zu schließen) – RomanPerekhrest

Antwort

2

Sie können alle Werte von Ergebnis und Filterauswahl sammeln.

var object = { choices: [{ choice: "a" }, { choice: "b" }, { choice: "c" }, { choice: "d" }, { choice: "e" }, { choice: "f" }, { choice: "g" }], results: [{ result: ["a", "b", "c"] }, { result: ["a", "b", "d"] }, { result: ["a", "b", "e"] }] }, 
 
    hash = Object.create(null), 
 
    notIn = []; 
 

 
object.results.forEach(function (a) { 
 
    a.result.forEach(function (b) { 
 
     hash[b] = true; 
 
    }); 
 
}); 
 

 
notIn = object.choices.filter(function (a) { 
 
    return !hash[a.choice]; 
 
}); 
 

 
console.log(notIn);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6 mit Set

var object = { choices: [{ choice: "a" }, { choice: "b" }, { choice: "c" }, { choice: "d" }, { choice: "e" }, { choice: "f" }, { choice: "g" }], results: [{ result: ["a", "b", "c"] }, { result: ["a", "b", "d"] }, { result: ["a", "b", "e"] }] }, 
 
    results = object.results.reduce((s, a) => new Set([...s, ...a.result]), new Set), 
 
    notIn = object.choices.filter(a => !results.has(a.choice)); 
 

 
console.log(notIn);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

+1 für die '' 'Set''' Lösung, möglicherweise für' '' '' '' 'statt' '' var''' wäre besser für eine vollständige ES6-Lösung? – Anis

+0

@Anis, eigentlich ist der Umfang nicht das Problem. –

+0

stimme ich völlig zu, und da es egal ist, dachte ich nur, dass in diesem Fall ein besserer Standard wäre. – Anis

0

Ich bin nicht sicher, ob Sie nach generischen Implementierungsideen fragen, oder nach Hinweisen, wie Sie es in Javascript implementieren können. Ich werde für die allgemeine Idee gehen. Sie können einfach eine set verwenden, um alle möglichen Ergebnisse zu speichern, dann durch die Auswahlmöglichkeiten iterieren und für jede Auswahl prüfen, ob sie in der Menge enthalten ist. Wenn nicht, können Sie die Aktion ausführen, die Sie möchten, wie Sie es verstecken, was auch immer das bedeutet.

0

Sie können filter() auf data.choices und dann some() und includes() verwenden, um zu überprüfen, ob in einigen der Objekte im Ergebnisarray eine Auswahl vorhanden ist.

var data = {"choices":[{"choice":"a"},{"choice":"b"},{"choice":"c"},{"choice":"d"},{"choice":"e"},{"choice":"f"},{"choice":"g"}],"results":[{"result":["a","b","c"]},{"result":["a","b","d"]},{"result":["a","b","e"]}]} 
 

 
data.choices = data.choices.filter(function(o, i) { 
 
    var check = data.results.some(e => e.result.includes(o.choice)) 
 
    return check; 
 
}) 
 

 
console.log(data)

0

var choices = {choices:[{choice:"a"},{choice:"b"},{choice:"c"},{choice:"d"},{choice:"e"},{choice:"f"},{choice:"g"}],results:[{result:["a","b","c"]},{result:["a","b","d"]},{result:["a","b","e"]}]}, 
 

 
    elems1 = choices.results.map(v => v.result).reduce((a,b) => a.concat(b)), 
 
    filtered = [...new Set(elems1)]; 
 
    choices.choices = choices.choices.filter(v => filtered.some(c => c == v.choice)); 
 
    console.log(choices);

+0

Bitte fügen Sie eine Erklärung hinzu, warum/wie dieser Code dem OP hilft. Dies wird helfen, eine Antwort zu liefern, von der zukünftige Zuschauer lernen können. Weitere Informationen finden Sie unter [diese Meta-Frage und ihre Antworten] (http://meta.stackoverflow.com/q/256359/215552). Dies scheint ein Thema hier zu werden, @Kinduser ... –

+0

@MikeMcCaughan Eigentlich möchte ich nichts schreiben, weil dies zu kompliziert ist ... Ich werde auf Nina Antwort warten und werde mich entscheiden, zu gehen oder meine zu löschen Antworten. Wenn ich mich entscheide, es zu verlassen, werde ich jeden Schritt beschreiben. –

+0

@Kinduser, Sie könnten mit 'Set' reduzieren, anstatt die Werte zu mappen. –

Verwandte Themen