输出frends名称而不是ID

时间:2018-02-03 16:04:33

标签: javascript arrays

有人可以帮我解决这个问题吗,我刚接触javaScript并且陷入了这一点。我在我的数组中输出了某个对象,该输出正在写一个人值,在该对象内(Osoba)有一个数组他的朋友和里面的所有价值观都是每个人的身份证,http://prntscr.com/i9m2ti我如何将朋友数组的ID(在对象内)作为该人的名字和姓氏,其中id在数组中,当时我想输出一个特定的对象,所以会有朋友[他们的名字而不是ID],有人可以写下我怎么能这样做。感谢您的理解。

docker-compose up

3 个答案:

答案 0 :(得分:1)

假设json是一个数组且包含所有人,您可以映射到friends数组,并找到具有该ID的人:person['friends'].map(json.find(function(person){person.id===friendId});

然后返回一个包含该人的名字和姓氏的对象:

console.log("json is:",JSON.stringify(json,undefined,3));
var friends = person['friends'].map(
  function(friendId){
    console.log("friendID is:",friendId);
    var friend = json.find(function(person){return person.id===friendId;});
    console.log("friend is:",JSON.stringify(friend,undefined,2));
    return {
      firstName:friend.firstName,
      surname:friend.surname
    }
  }
);

现在,如果"不起作用"你能否指出日志的输出,任何错误和预期结果与实际结果?

更新完整代码

由于json是你的所有数据,你可以将它传递给你的Osoba构造函数。朋友getter将使用这些数据创建一个数组Osaba项目,这些项目将拥有数据和朋友,将创建一个Osaba阵列......

class Osoba {
  constructor(id, firstName, surname, age, gender, friends, data) {//added data
    this._id = id;
    this._firstName = firstName;
    this._surname = surname;
    this._age = age;
    this._gender = gender;
    this._friends = friends;
    this._data = data;//data has all the people
  }

  get id() {
    return this._id;
  }
  set id(id) {
    this._id = id;
  }
  get firstName() {
    return this._firstName;
  }
  set firstName(firstName) {
    this._firstName = firstName;
  }
  get surname() {
    return this._surname;
  }
  set surname(surname) {
    this._surname = surname;
  }
  get age() {
    return this._age;
  }
  set age(age) {
    this._age = age;
  }

  get gender() {
    return this._gender;
  }
  set gender(gender) {
    this._gender = gender;
  }
  //modified friends getter returning an array of Osoba items
  get friends() {
    var me = this;
    return this._friends.map(
      function (friendId) {
        var friend = me._data.find(function (person) { return person.id === friendId; });
        return new Osoba(
          friend.id,
          friend.firstName,
          friend.surname,
          friend.age,
          friend.gender,
          friend.friends,
          me._data
        );
      }
    );
  }

  set friends(friends) {
    this._friends = friends;
  }

}
$.getJSON('https://raw.githubusercontent.com/Steffzz/damnz/master/data.json')
  .then(
  json => {
    var people = json.map(
      person =>
        new Osoba(
          person.id,
          person.firstName,
          person.surname,
          person.age,
          person.gender,
          person.friends,
          json
        )
    );
    //you can keep getting friends now, because Osoba is
    //  creating new Osoba objects based on id's and data you pass in
    console.log(people[0].friends[0].friends[0].friends[0]);
  }
  );

答案 1 :(得分:0)

如果我理解正确,你只想使用id作为id,firstname和lastname。所以只传递id 3次而不是firstname和lastname:

var x = new Osoba(id,id,id,age,gender,friends);

~~~~

好的,你想要的实际上是每个朋友对象中的id属性是朋友的名字和姓氏,而不是想法代码。所以它基本上与我之前建议的相反。你所要做的就是操纵你推送到id的内容。它没有义务成为json的身份。

所以在你的情况下:

for(person of json){

        var id = person['firstName'] + "" + person['surname']; // line to change.
        var firstName = person['firstName'] ;
        var surname = person['surname'] ;
        var age = person['age'] ;
        var gender= person['gender'] ;
        var friends = person['friends'] ;

        var x = new Osoba(id,firstName,surname,age,gender,friends); 
        osobe.push(x); //filling array with objects and their values
    }   

答案 2 :(得分:0)

而不是

var friends = person['friends'] ;

尝试

var friends = []; 
var friendIDs = person['friends'] ; //retrieve friendIDs

for(friendID of friendIDs) { //loop over friendIDs
  var friend = json[friendID]; //get friend dataset out of the json
  friends.push(friend['firstName']); // add friend dataset to friends array
}

我在这里假设那些朋友也在那个json中。并且id表示该数组中的索引。如果索引不是那些id那么这将不起作用。如果是这样,我可以随意评论,我会编辑我的答案。