如何通过引用传递(模拟)

时间:2016-06-24 23:06:25

标签: javascript scope reference

我在解决这个问题时遇到了麻烦,但是我有一个可行的解决方案,我怀疑它是最理想的解决方案。

以下是问题:

想象一个对象数组,每个对象代表一个人。

var people = [
{id:1, name:"John", points: 50},
{id:2, name:"Mark", points: 80},
{id:3, name:"Peter", points: 25},
];

在我们的人员阵列中,我们有3人拥有唯一ID 属性。

现在假设我们有多个修改/更新人物对象的函数。

  

显然这不起作用,因为外部对象不会受到影响   通过incrementPoints()函数中的更改。

var myPerson = people[0]; 

incrementPoints(myPerson){
  myPerson.points++;
};

// myPerson.points = 50
addPoints(myPerson); // We're passing an person object to addPoints;
// myPerson.points = 50 (Did not change, not affected by addPoints)
  

然而,这会起作用!但我们付出的代价是成本   迭代人数组并匹配所需人员的身份。

function getPersonIndexById(personId){
 // Iterate through all persons in 'people' array 
 for(var index = 0; index < people.length; index++)
   people[i].id === personId ? return index : continue; 
}

function incrementPoints(personId){
people[ getPersonIndexById(personId) ].points++;
}

function decrementPoints(personId){
people[ getPersonIndexById(personId) ].points--;
}

是否有更好/更简单/更清洁/更有意义的概念来处理这种情况。显然,理想的解决方案是传递和参考,但javascript不允许这样做。我并不是想要实现无用的黑客攻击,而是要了解开发人员遇到类似情况时所做的事情以及他们如何解决这些问题。

3 个答案:

答案 0 :(得分:1)

var people = [
  {id:1, name:"John", points: 50},
  {id:2, name:"Mark", points: 80},
  {id:3, name:"Peter", points: 25},
];

var myPerson = people[0]; 

function incrementPoints(myPerson){
  myPerson.points++;
};

function addPropertyToPerson(myPerson, lastname) {
  myPerson.lastName = lastname;
}

// The properties of the myPerson object can still be modified since 
// the value passed in to the function is the reference to the object
incrementPoints(myPerson);
console.log(myPerson);

// Similarly, additional properties can still be added since 
// the value passed in to the function is the reference to 
// the outer object
addPropertyToPerson(myPerson, "smith"); 
console.log(myPerson);

答案 1 :(得分:1)

  • 将对象作为参考传递
  • 您定义了名称为incrementPoints的函数,但语法错误,但您正在调用addPoints。我希望这是一个错字/错误。
  • 如果我认为它是addPoints那么它工作正常。在该功能调用之后,您将获得51分。
  • 您可以使用Array.prototype.find按ID查找某个人,它是内置的并且速度很快。

function incrementPoints(personId){

       var person = people.find(function(p){
            return p.id === personId;
       });
      if (person) {
         person.points++;
      }
    }

答案 2 :(得分:0)

我更愿意在获取数据时将数组转换为地图。

var personMap = {}; people.forEach(function(person){ personMap[id] = person; });

现在你有了地图

您可以将此人视为personMap[personId]

此处创建地图是一次性活动,因此您需要进行一轮迭代

请承担我的回复..我正在回复手机,因此格式化可能不太好