2017-02-19 6 views
3

Derzeit habe ich ein Array ([1, 3]), die den Index enthält den Wert des key-falseEin Array aus bestehendem Array erweitern?

Gibt es eine gute Art und Weise zu ändern, diesen Code zu verbessern, so dass ich nicht haben den Standardwert angeben, wie in Variable b? Diese

ist, weil die Standard Array von Objekten sehr groß sein könnte, (der Code unten ist ein vereinfachtes Problem aus meiner Anwendung ..)

//Specify default value 
const b = [ 
    { key: true }, 
    { key: true }, 
    { key: true }, 
    { key: true }, 
    { key: true } 
] 

[1, 3].forEach((x) => { 
    b[x].key = false; 
}) 
+0

besser Um die Frage zu verstehen, müssen Sie jedes Element in 'b', einzigartig sein? Wenn Sie nicht den Standardwert in "b" angeben, woher kommt dieser Wert? Abhängig von Ihrer Situation benötigen Sie möglicherweise eine andere Lösung. – unional

+0

Können Sie das konkrete Problem, das Sie lösen möchten, besser erklären? Ich bin mir nicht sicher, ob Ihre bestehende Verwendung von Datenstrukturen sinnvoll ist. – Brad

+0

Was ist mit Ihrem aktuellen Code falsch? Versuchen Sie, die Definition von "b" zu optimieren? Wie viele Elemente sollte es haben? –

Antwort

0

Try this:

//Specify default value 
 
const b = []; 
 

 
[1, 3].forEach((x) => { 
 
    if (b[x]) { 
 
    b[x].key = false; 
 
    } else { 
 
    b[x] = { key: false }; 
 
    } 
 
}) 
 

 
console.log(b);

Nicht, dass die Werte dazwischen nicht definiert sind. Wenn das ein Problem ist würde ich vorschlagen, eine Funktion zu machen, den Wert zu überprüfen, wie so:

var something = b[x] ? b[x].key : true; 
1

„Gibt es eine gute Möglichkeit, diesen Code zu verbessern, so dass ich muß nicht den Standard angeben ? Wert wie in der variablen b gezeigt Dies liegt daran, dass die Standard-Array von Objekten riesigen „

Meine Interpretation Ihrer Frage lautet wie folgt:“ könnten wie kann ich eine potenziell riesige Auswahl von Objekten zu erstellen, in dem alle Standard ist {key: true}außer für diejenigen an den Indizes in einem anderen Array angegeben, die {key: false} sein sollte? " Ich gehe davon aus, dass Sie zu der Zeit wissen, wie viele Objekte Sie insgesamt haben wollen.

Es ist schwer zu sagen, was ist "am besten" gegeben, dass Sie die Dinge für die Zwecke der Frage vereinfacht haben. Ich vermute, vielleicht gibt es eine passendere Datenstruktur als das, was Sie für b gezeigt haben, aber ohne weitere Informationen über Ihren echten Code, hat es keinen Sinn, zu erraten.

also ein Array von Objekten zu erstellen, in dem alle Objekte standardmäßig auf dem gleichen key Wert, sondern als ein potentiell „großen“ Arrayliteral Sie können nur eine Schleife verwenden:

const b = new Array(desiredNumberOfObjects) 
for (let i = 0; i < b.length; i++) 
    b[i] = { key: true } 

... und dann Führen Sie Ihr vorhandenes [1, 3].forEach(...) aus, um die erforderlichen Elemente auf false festzulegen.

Das wäre einigermaßen effizient, weil es nur die Haupt-Array b und das Exceptions-Array einmal durchläuft.

+0

_ "... und führen Sie dann Ihre vorhandenen' [1, 3] .forEach (...) 'aus, um die erforderlichen Elemente auf' false' zu ​​setzen. _ Wenn Frage richtig interpretieren, sind zwei Schleifen nicht notwendig, um 'Boolean 'zu setzen "Wert. – guest271314

+0

@ guest271314 - Offensichtlich ist es einfach, mit 'b [i] = {key: exceptions.includes (i)}' (oder '.indexOf (i)> - 1') zu codieren, aber es scheint ein Nachschlagen bei jeder Iteration zu sein für mich ineffizient. – nnnnnn

+0

Was meinst du mit "Hauptschleife"? OP beschreibt beginnend mit "Standard-Array von Objekten". Es sollte nur eine Schleife benötigt werden, um eine bestimmte Eigenschaft jedes Objekts auf 'Boolean'' true' oder 'false' zu ​​setzen. – guest271314

0

Sie müssen wissen, wie groß das Array sein sollte. Sagen wir es ist 6.Dann können Sie das Array mit Array.from mit einem mapFn Argument initialisieren:

const b = Array.from(Array(6),() => ({key: true})); 
 

 
[1, 3].forEach(x => b[x].key = false); 
 

 
console.log(b);

Sie könnten versucht sein, fill zu verwenden:

Array(6).fill({key: true}) 

aber dies wird nicht wie erwartet, da Das gleiche Objekt wird an jeder Position im Array platziert.

0

Sie können einen Eigenschaftsnamen speichern, der auf eine Variable festgelegt wird. Verwenden Sie Array.prototype.entries(), um den Index und den Wert des Arrays bei for..of zu loopen. Setzen Sie den Wert der Eigenschaft am Objekt auf 10 und geben Sie den Wert .indexOf() für das Array der Indizes ein.

const arr = [ 
 
    { a: 1 }, 
 
    { b: 2 }, 
 
    { c: 3 }, 
 
    { d: 4 }, 
 
    { e: 5 } 
 
]; 
 

 
let [indexes, prop] = [[1, 3], `key`]; 
 

 
for (let [key, value] of arr.entries()) value[prop] = indexes.indexOf(key) > -1; 
 

 
console.log(arr);

Verwandte Themen