2016-12-12 5 views
-1

Ich versuche, String-Wert als Funktion Parameter zu übergeben, aber ich brauche String-Wert innerhalb FunktionString-Wert Get, JavaScript

Hier ist der Code:

EDIT:

var array = [{someValue: 5}, {someOtherValue: 10}]; 
var newArray = []; 
var obj = {value: "someValue"}; 
var setValue = function(choosenValue) { 

for (let i = 0; i < array.length; i++) { 
    newArray.push({ 
    choosenValue: array[i].choosenValue 
    }); 
} 

} 

setValue(obj.value); 

EDIT: Was ich bekommen will, ist newArray = [someValue: 5]; Ich will neues Array von Array mit Schlüssel, der als Parameter übergeben wird und ChhosenValue ist auch Wert innerhalb Array, und ich will es Wert. Es sollte ein Array von Objekten mit denselben Schlüsseln aber unterschiedlichen Werten sein.

Wert von Objekt wird sich ändern und hängt davon ab, was ausgewählt wird Ich muss Array durchlaufen. Da chooseValue eine Zeichenkette ist, kann ich das Array korrekt durchlaufen.

Ich habe versucht mit choosenValue.valueOf(), aber es funktioniert nicht. Irgendeine andere Idee?

Ich bekomme drinnen(), dass chooseValue nicht definiert ist.

+1

was ist array im code? Fehlt dir hier irgendetwas – Geeky

+2

Was denkst du, dass 'array [i] .choosenValue 'bedeutet? Wenn Sie Ihren Parameter verwenden möchten, verwenden Sie einfach Ihren Parameter. – SLaks

+0

Bitte geben Sie mehr von Ihrem Code. Wo ist 'Array' definiert? –

Antwort

2

Ich bin nicht ganz sicher, was Sie Ihren Code wollen tun werden, also werde ich eine Menge von Annahmen, hier zu machen.

Beginnen wir mit dem, was Sie gerade in Ihrer Frage:

var array = [{someValue: 5}, {someOtherValue: 10}]; 
var newArray = []; 
var obj = {value: "someValue"}; 
var setValue = function(choosenValue) { 

    for (let i = 0; i < array.length; i++) { 
     newArray.push({ 
      choosenValue: array[i].choosenValue 
     }); 
    } 

} 

setValue(obj.value); 

Es sieht aus wie das, was Sie tun möchten gesetzt Wert newArray basierend auf dem Wert des Eintrags von array mit dem Namen choosenValue. Das heißt, für irgendeinen Wert von choosenValue muss ein Eintrag in array mit diesem Namen vorhanden sein.

In erster Linie ist diese Art von Logik typischer für einen Map/Dictionary-Datentyp als für einen Array-Datentyp.Also statt

var array = [{someValue: 5}, {someOtherValue: 10}] 

ein einfaches und logisches Konstrukt würde aussehen wie

var map = { someValue: 5, someOtherValue: 10 } 

Dann können Sie auf die Wert von map beziehen von

map.someValue 

verwenden oder mit Ihrem choosenValue Variable

map[choosenValue] 

Keine Funktion oder Schleifen notwendig.

Aber schauen wir uns diese Schleife trotzdem an. Was es gerade macht, ist zu sagen: "Für jeden Eintrag in array möchte ich den Wert der Eigenschaft choosenValue". Wenn man bedenkt, dass die Objekte, die in array gespeichert sind, aus einer einzigen Eigenschaft bestehen, die someValue in einem und in dem anderen genannt wird, erhalten Sie garantiert einen undefined, wenn Sie versuchen, choosenValue auf jedes Objekt zu erhalten.

Wenn das, was Sie wollten, war eine Liste von Eigenschaftswerten aus einer Menge von Objekten mit ähnlichen Eigenschaftsnamen zu erhalten, was sollte man würde dies etwas mehr wie sein:

var array = [{ someValue: 5, someOtherValue: 10 } , 
      { someValue: 6, someOtherValue: 12 }] 
var newArray = []; 
var setValue = function(choosenValue) { 

    for (let i = 0; i < array.length; i++) { 
     newArray.push(array[i][choosenValue]); 
    } 
} 

Nun ist diese deutlich sagt: „Für jedes Element in array, erhalten Sie mir den Wert der Eigenschaft von choosenValue benannt ".

Aus Gründen der Klarheit habe ich auch obj entfernt, die eine unnötige Verkapselung eingeführt . Ich habe auch keine Objekte auf newArray geschoben. In gewisser Hinsicht sind die Werte von newArray bereits eine Menge von choosenValue, denn das ist es, was ein Array darstellen soll: eine Menge logisch zusammenhängender Daten desselben Typs. Wenn newArray stellt tatsächlich eine Reihe von Objekten, und choosenValue ist nur eine von möglicherweise vielen Bereichen auf jedes Objekt, dann

newArray.push({ choosenValue: array[i][choosenValue] }); 

angemessen wäre.

EDIT

Nach Ihrem bearbeiten, was Sie wirklich wollen, ist das Feld, Namen und alle, zu entreißen und es in einem neuen Objekt zu setzen. Das ist etwas knifflig, da JavaScript (zumindest ECMAScript 5) es nicht mag, wenn Sie den Namen eines Feldes über den Wert eines anderen Feldes setzen. Zumindest nicht während des Objektbaus. Die Lösung ist ein leeres Objekt zuerst zu erstellen, und dann ein Feld über Array-Notation gesetzt, etwa so:

var obj = {} 
obj[fieldname] = "someval" 

In Bezug auf den Code, soll die Schleife dann in etwa so aussehen:

for (let i = 0; i < array.length; i++) { 
    var temp = {} 
    temp[choosenValue] = array[i][choosenValue] 
    newArray.push(temp) 
} 

Nicht die eleganteste Schlaufe, aber sie erledigt die Arbeit.

1 - Wenn ein Objekt nur ein Feld hat und Sie dieses Feld herausziehen und übergeben, sollten Sie das Feld im Allgemeinen einfach aus dem Kapselungstyp herausziehen und es blank verwenden. Die Zeiten, in denen es in einem einkapselnden Typ in Ordnung ist, sind, wenn Sie das gesamte Objekt übergeben und weitere Felder in der Zukunft hinzufügen möchten.

+0

Ich denke, Sie sind auf dem richtigen Weg, aber bis das OP klärt die Anforderungen, es ist nur Ratespiel. Gute Antwort. – Moob

+0

danke für eine detaillierte Erklärung. Dieser newArray.push ({choosenValue: array [i] [choosenValue]}); funktioniert nur mein key hat name genau "choosenValue" nicht wert, den ich von obj "someValue" bekommen habe. Wie behebt man das? –

+0

Ihre Bearbeitung funktioniert. :) Erst jetzt habe ich Probleme mehr Tasten mit Werten im Array zu schieben. Zum Beispiel möchte ich ID mit Wert Array [i] .id in einem neuen Array? –

2

Sie müssen in "Array" Weise deklarieren, wenn Sie dynamischen Schlüssel verwenden möchten.

newArray[choosenValue] = array[i][choosenValue] 

So Ihr Code wird:

for (let i = 0; i < array.length; i++) { 
    newArray[choosenValue] = array[i][choosenValue] 
} 

Aber seien Sie vorsichtig, weil newArray für Sie ein Array ist, aber Sie wollen es durch Tasten mit Objekten füllen. Also ist die richtige Antwort make newArray ein Objekt.

var result = {} 

for (let i = 0; i < array.length; i++) { 
    result[choosenValue] = array[i][choosenValue] 
} 

Voll Beispiel

var result = []; 
var array = [{hello:"hello"}, {world:"world"}, {hello:"hello2"}]; 
var setValue = function(value) { 
    for (let i = 0; i < array.length; i++) { 
     if (array[i][value]) 
      result.push(array[i][value]); 
    } 
} 
setValue("hello"); 
console.log("Result", result); 
+0

Sie müssen auch ein Objekt in 'array [i]' initialisieren, zB 'if (! Array [i]) {array [i] = {};)' –

+0

Werfen Sie einen Blick auf meine Änderungen. Es ist definiert. –

+0

Wo soll ich das machen? Bevor push()? –