当前位置: 代码迷 >> JavaScript >> 遍历javascript对象的集合
  详细解决方案

遍历javascript对象的集合

热度:65   发布时间:2023-06-03 18:16:37.0

我试图只读取friends数组的第一个元素,并将其添加到每个对象的matchs数组中。 如果我直接在对象上添加matchs属性。 然后返回预期结果。 但是,如果我使用功能addmatches添加匹配项数组属性。 然后,每个动物对象的匹配数组值都相同。

var AnimalCreator = function(username, species, tagline, noises) {
  var friends = [];
   //var matches = [];
  return {
    username: username,
    species: species,
    tagline: tagline,
    noises: noises,
    friends: friends,
    //matches: matches
  }
};

var sheep = AnimalCreator('Cloud', 'sheep', 'You can count on me!', ['baahhh', 'arrgg', 'chewchewchew']);
var rabbit = AnimalCreator('Sky', 'Rabbit', 'I like jumping!', ['haha', 'heehee']);
var tiger = AnimalCreator('Tim', 'Tiger', 'I am strong!', ['Grrrr', 'grrrrrr!']);
var bear = AnimalCreator('Poo', 'Bear', 'I am your friend', ['wowo', 'whwhwh']);

var addFriend = function(animal, friend) {
  animal.friends.push(friend.username);
};

addFriend(sheep, rabbit);
addFriend(sheep, tiger);
addFriend(tiger, bear);

var myFarm = [sheep, rabbit, tiger, bear];

var addmatches  = function(farm){
  var matches = [];
  for(var i=0;i < farm.length; i++){
    farm[i].matches = matches;
  }
};

addmatches(myFarm);
var giveMatches = function(farm) {
  for (var i = 0; i < farm.length; i++) {
    if (farm[i].friends.length > 0) {
      farm[i].matches.push(farm[i].friends[0]);
    }
  }
};
giveMatches(myFarm);
console.log(myFarm);

matches是对一个空数组的引用,您的代码为每个farm对象分配了相同的引用( farm[i].matches = matches; ),您可以尝试通过直接分配空数组来尝试,例如

farm[i].matches = [];

您的评论代码:功能AnimalCreator是在每次调用创建一个新的数组实例,每个animal对象被引用到的,独特的,这就是为什么当你直接加入matches ,它按预期工作。

希望这会有所帮助!

这是因为数组是通过引用传递的,所以每个场对象都通过此“ farm [i] .matches = matchs;”指向同一数组。 要解决此问题,您可以进行多次整理。

  1. 更改“ farm [i] .matches =匹配;” 为“ farm [i] .matches = [];” (到目前为止,最好的选择)。
  2. 移动“无匹配项= [];” 在for循环内部,并使用由“ var”插入的“ let”。
  相关解决方案