2016-05-05 3 views
2

Heres die Situation -Iterieren über ein Objekt, um zu überprüfen, ob es Schlüssel in einem Array gibt

Ich habe ein Array und ein Objekt.

sagen:

var Array = ["field1", "field2", "field3"]; 
var Object = { field1: undefined, field2: undefined, field3: undefined, field4: undefined, field5: undefined} 

* die Werte im Objekt jetzt nicht wirklich wichtig

Mit Underscore.js i über das Objekt iterieren möchten, und überprüfen, ob jeder der Tasten zu sehen, besteht in das Array-Array. Wenn ich will, kann ich seinen Wert auf wahr setzen und wenn nicht, möchte ich es auf false setzen.

Bisher habe ich versucht:

_.mapObject(Object, function(val, key){ 

     for (var j = 0; j < Array.length; j++) { 
      currentKey = Array[j]; 
      (function(i){ 
       for (var k = 0; k < Array.length; k++) { 
        if(key === Array[i]) { 
         return val = true; 
        } else { 
         return val = false; 
        } 
       } 
      })(currentKey); 
     } 

    }); 

Scheiße sehr verwirrend ist; für mich zumindest. Jede Hilfe wird geschätzt.

+3

Es ist eine sehr schlechte Idee, Ihre Objekte 'Object' und Ihre Arrays' Array' zu nennen, da dies die eingebauten Klassennamen sind und Sie später wahrscheinlich viele lustige Fehler bekommen. Wie wäre es mit "obj" und "arr"? – phihag

+0

Sie dürfen nicht "false" zurückgeben, wenn nur einer der Schlüssel nicht derselbe ist. – Bergi

Antwort

1

Hier ist eine Lösung mit Strich:

var result = _.mapObject(Object, function(value, field){ 
     return _.contains(Array, field); 
    }); 

oder wenn Sie Objekt ändern möchten sich:

var result = _.each(Object, function(value, field){ 
     return _.contains(Array, field); 
    }); 
+0

Vielen Dank @Gruff Bunny! –

0

Sie brauchen nicht underscore dies zu tun:

var arr = ['a','b','c'], 
 
     obj = {a: '', b: '', c: '', d:''}; 
 

 
function check (a, o) { 
 
    for (var key in o) { 
 
     if (a.indexOf(key) != -1) { 
 
      o[key] = true 
 
     } 
 
    } 
 
} 
 

 
check(arr,obj); 
 

 
document.write(JSON.stringify(obj))

1

Ich glaube nicht, dass Sie für diese unterstreichen müssen:

var a = ["field1", "field2", "field3"]; 
var o = { field1: undefined, field2: undefined, field3: undefined, field4: undefined, field5: undefined} 

for (var k in o) { 
    o[k] = a.indexOf(k) != -1; 
} 
1

Wie andere gesagt haben, es gibt keine Unterstreichung nötig.

Sie können das native Object.keys verwenden, um ein Array von own Schlüsseln zurückzugeben und dann über sie zu iterieren. Object.keys enthält keine geerbten Eigenschaften aus der Prototyp-Kette, die for in wird. Es ist jedoch wesentlich langsamer, was ein Problem mit großen Datenmengen sein könnte.

Object.keys(obj) 
    .forEach(function (key) { 
     obj[key] = (arr.indexOf(key) !== -1); 
    }); 

Fiddle

Object.keys

Verwandte Themen