2016-04-15 14 views
0

ich eine api haben (in NodeJS) Antwort, die ein Array zurückgibt:kann nicht durch JSON-Array iterieren

res.json(friends) 
[ 
    { 
     "id": 7795239, 
     "username": "janesmith" 
    }, 
    { 
     "id": 1363327, 
     "username": "johnsmith" 
    } 
] 

Aber wenn ich durch das Array zu durchlaufen wollen, bevor diese Antwort zu senden, kann ich den Weg nicht finden um dies zu tun. users.length existiert nicht, for(var key users) funktioniert auch nicht.

Wie löst man das?

edit: der Code, wo es das Array bekommt:

User.find({}, function(err, users){ 
    if(err) res.send(err); 
    var friends; 
    var result = 'this will hold the result'; 

    for(var key in users){ 
     if(users[key].username == req.decoded.username) { 
      friends = users[key].friends; 
     } 
    } 

    // here I want to do things with the list of friends, so this is the place where I need to iterate over it 

    res.json(result); 
}); 

Dies ist das Protokoll Ergebnis für users und err

users: 
    [ 
     { 
      "_id": "5710b02c7787794009325f62", 
      "username": "demouser", 
      "__v": 0, 
      "friends": 
      [ 
       { 
        "username": "janesmith", 
        "id": 7795239 
       }, 
       { 
        "username": "johnsmith", 
        "id": 1363327 
       } 
      ] 
     } 
    ] 
err: null 

Dies ist das Protokoll des Schlüssels ist:

toObject 
toJSON 
items 
db 
discriminators 
__v 
id 
_id 
friends 
password 
username 
userID 
schema 
collection 
comparePassword 
save 
$__delta 
$__version 
increment 
$__where 
remove 
model 
$__buildDoc 
init 
$__storeShard 
hook 
pre 
post 
removePre 
_lazySetupHooks 
update 
set 
$__shouldModify 
$__set 
getValue 
setValue 
get 
$__path 
markModified 
$__try 
modifiedPaths 
isModified 
isDirectModified 
isInit 
isSelected 
validate 
invalidate 
$__reset 
$__dirty 
$__setSchema 
$__registerHooks 
$__error 
$__doQueue 
$toObject 
inspect 
toString 
equals 
populate 
populated 
$__fullPath 
domain 
_events 
_maxListeners 
setMaxListeners 
getMaxListeners 
emit 
addListener 
on 
once 
removeListener 
removeAllListeners 
listeners 
listenerCount 
+1

Können Sie eine Demo veröffentlichen, um das Problem zu reproduzieren? – elclanrs

+1

Benötigen Sie mehr Code zu beantworten. Können Sie zeigen, wo Sie das Array zuweisen? – spongessuck

+0

Wenn Sie diesen JSON (ohne natürlich die res.json (users)) in ein Objekt einlesen, sollten Sie in der Lage sein, ohne Probleme über seine Eigenschaften zu iterieren. – ManoDestra

Antwort

0

Initialisieren Sie einfach Ihre Ergebnisvariable als ein Array und drücken Sie die Benutzer, die Sie sind sh, um in dieses Array zu passen und es zurückzugeben.

User.find({}, function(err, users){ 
    if (err) res.send(err); 

    var result = []; 
    for (var key in users) { 
     if (users[key].username == req.decoded.username) { 
      var friends = users[key].friends; 
      for (var i = 0; i < friends.length; i++) { 
       // Do stuff with each friend here, as required. 
      } 

      result.push(users[key]); 

      // OR this, depending on whether it is users or friends you're trying to return. 
      result.push(friends[i]); 
     } 
    } 

    res.json(result); 
}); 
+0

Dies sollte ein Kommentar sein, keine Antwort. – trincot

+0

Nein, es ist eine Antwort auf sein Problem. Er muss einfach den JSON in ein Objekt einlesen und er ist fertig. Und diese Antwort zeigt, wie man es macht, indem man die JSON-Zeichenkette benutzt, die er gegeben hat. Ich habe illustriert, dass es nach dem korrekten Parsen des JSON vollkommen möglich ist, auf die length -Eigenschaft des Arrays zuzugreifen und dann auf Eigenschaften von den Objekten in diesem Array zuzugreifen. – ManoDestra

+0

Ich habe einen Fehler, wenn ich versuche, dies zu analysieren: 'undefined: 1 [{id: 7795239, Benutzername: 'janesmith'}, ^ Syntaxerror: unerwartete Token i bei Object.parse (nativ)' – stijnpiron

0

scheint wie die find Methode der API, um ein Objekt anstelle eines Arrays zurück.

User.find({}, function(err, users){ 

    /* You expect users to be an array, but I suspect this is actually what it is: 

    users = { 
     "_id": "5710b02c7787794009325f62", 
     "username": "demouser", 
     "__v": 0, 
     "friends": 
     [ 
      { 
       "username": "janesmith", 
       "id": 7795239 
      }, 
      { 
       "username": "johnsmith", 
       "id": 1363327 
      } 
     ] 
    } 
    */ 

    if(err) res.send(err); 
    var friends; 
    var result = 'this will hold the result'; 

    /* Try without the loop to confirm: 
    for(var key in users){ 
     if(users[key].username == req.decoded.username) { 
      friends = users[key].friends; 
     } 
    }*/ 

    if(users.username == req.decoded.username) { 
     friends = users.friends; 
    } 

    // here I want to do things with the list of friends, so this is the place where I need to iterate over it 

    res.json(result); 
}); 
+0

Versuchte dies, aber bekam '[]' danach in der Konsole – stijnpiron

+0

Nun, offensichtlich 'Benutzer' hat eine Eigenschaft namens' Freunde', die ein leeres Array ist, was nicht erwartet wurde, aber es hat 'username' übereinstimmend 'req.decoded.username' oder' friends' wären 'undefiniert'. Ich bin immer noch davon überzeugt, dass diese API nicht zurückgibt, was Sie wollen und dass das, was Sie als Wert von "Benutzer" veröffentlicht haben, nicht das ist, was es tatsächlich ist. – spongessuck