Javascript 如何访问嵌套数组的值?

Javascript 如何访问嵌套数组的值?,javascript,Javascript,我想要从中检索属性的对象数组中有一个数组。我已经完成了,但它看起来很笨重。是否有更好的方法在每个房间的每个StaffList数组中循环 window.onload = getInitials; var data = { "room" : [ { "id" : 1, "StaffList": [ { "inroom": tr

我想要从中检索属性的对象数组中有一个数组。我已经完成了,但它看起来很笨重。是否有更好的方法在每个房间的每个StaffList数组中循环

window.onload = getInitials;
var data = {
    "room" : [
        {
            "id" : 1,
            "StaffList": [
                {                  
                  "inroom": true,                  
                  "initials": "MG"
                },
                {
                  "inroom": false,
                  "initials": "CT"
                },
                {
                  "inroom": true,
                  "initials": "MS"
                }
            ]
        },
        {
            "id" : 2,
            "StaffList": [
                {                  
                  "inroom": true,                  
                  "initials": "MG"
                },
                {
                  "inroom": false,
                  "initials": "CT"
                },
                {
                  "inroom": true,
                  "initials": "MS"
                },
                {
                  "inroom": true,
                  "initials": "MA"
                }
            ]
        }   

    ]
}

function getInitials() {
    var len = data.room.length;
    for(i = 0; i < len; i++) {
        var staffArray = data.room[i].StaffList;
        var room = data.room[i].id;
        if( staffArray != null ) {
            var allStaff = staffArray.filter(function(person) {
                if ( person.initials ) {
                    var inits = person.initials;
                    setInitials(room, inits);
                }
            });
        }
    }
}

function setInitials(room, initials) {
    //get element by ID
    //var staffContainer = $('#div' + room);
    var staffContainer = document.getElementById('div' + room);
    if(staffContainer != null) {
        //create new div to append
        var newDiv = document.createElement('div');
        newDiv.innerHTML = initials; 
        //append newly created <div>
        staffContainer.append(newDiv);
    }
}

没有关于如何排序的任何实际细节:只需与排序函数一起使用,它的设计目的是要注意排序已到位,它修改正在排序的数组,而不仅仅是生成一个新数组作为函数输出:

var data = ....;

// preprocess your data
data.rooms.forEach(function(room) {
  doSomethingToYour(room);
});

// sort stafflists per room, which we can only do
// after your preprocessing has completed.
data.rooms.forEach(function(room) {
  room.StaffList.sort(function(a,b) {
    a = a.initials;
    b = b.initials;
    return a<b? -1 : a>b ? 1 : 0;
  });
});

// optionally, we can sort the rooms now, if those
// relied on ordered StaffList. If not, we could have
// sorted them at any point.
data.rooms.sort(function(a,b) {
  return b.id - a.id;
}); 

没有关于如何排序的任何实际细节:只需与排序函数一起使用,它的设计目的是要注意排序已到位,它修改正在排序的数组,而不仅仅是生成一个新数组作为函数输出:

var data = ....;

// preprocess your data
data.rooms.forEach(function(room) {
  doSomethingToYour(room);
});

// sort stafflists per room, which we can only do
// after your preprocessing has completed.
data.rooms.forEach(function(room) {
  room.StaffList.sort(function(a,b) {
    a = a.initials;
    b = b.initials;
    return a<b? -1 : a>b ? 1 : 0;
  });
});

// optionally, we can sort the rooms now, if those
// relied on ordered StaffList. If not, we could have
// sorted them at any point.
data.rooms.sort(function(a,b) {
  return b.id - a.id;
}); 
您可以使用一些forEach:

在这里,我们首先遍历每个房间,然后遍历StaffList中的每个人。由于第二个forEach位于第一个forEach内,因此我们可以通过闭包访问其作用域,请参阅。然后我们就可以使用新参数room和person来表示setInitials

请注意,var语句是如何不被使用的。当您不需要创建状态变量时,不要这样做。更少的状态通常也意味着更少的错误。但是,在setInitials函数中,使用容器和新div的状态是一种方法

附言:你的代码还有其他一些让我发痒的地方。您的可变房间不是房间对象,而是一个id。这是误导!确保为正确的事情使用正确的名称。在这里,如果希望一个状态存储房间的id,请将其命名为roomId

您在一篇评论中说,您还希望在创建的div上添加一个类。顺便说一下,如果inroom值为true,您应该这样做。在这种情况下,您可以将其作为setInitials的第三个参数传递,然后根据其在函数体中的值添加类。

您可以使用一些forEach:

在这里,我们首先遍历每个房间,然后遍历StaffList中的每个人。由于第二个forEach位于第一个forEach内,因此我们可以通过闭包访问其作用域,请参阅。然后我们就可以使用新参数room和person来表示setInitials

请注意,var语句是如何不被使用的。当您不需要创建状态变量时,不要这样做。更少的状态通常也意味着更少的错误。但是,在setInitials函数中,使用容器和新div的状态是一种方法

附言:你的代码还有其他一些让我发痒的地方。您的可变房间不是房间对象,而是一个id。这是误导!确保为正确的事情使用正确的名称。在这里,如果希望一个状态存储房间的id,请将其命名为roomId

您在一篇评论中说,您还希望在创建的div上添加一个类。顺便说一下,如果inroom值为true,您应该这样做。在这种情况下,您可以将其作为setInitials的第三个参数传递,然后根据其在函数体中的值添加该类。

几点建议:

使用嵌套循环检索嵌套数组值

这个很简单:外部循环将遍历房间数组,而内部循环将遍历每个房间的员工数组

在下面的示例代码中,我的外部循环是while循环,内部循环是for循环,但是您当然可以使用您喜欢的任何方法来完成它

function getInitials() {
  var len = data.room.length;
  while (len--) {
    var staffArray = data.room[len].StaffList;
    var room = data.room[len].id;
    for (var i = 0; i < staffArray.length; i++) {
      var person = staffArray[i];
      if (person.initials) {
        setInitials(room, person.initials);
      }
    }
  }
}

function setInitials(room, initials) {
  var staffContainer = document.getElementById("div" + room);
  if (staffContainer != null) {
    var newDiv = document.createElement("div");
    newDiv.innerHTML = initials;
    staffContainer.appendChild(newDiv);
  }
}
第一组{ 背景颜色:白肋木; } 第二组{ 背景颜色:深红色; } div{ 高度:自动; 宽度:50px; 填充:3倍; 保证金:2倍; } 有几点建议:

使用嵌套循环检索嵌套数组值

这个很简单:外部循环将遍历房间数组,而内部循环将遍历每个房间的员工数组

在下面的示例代码中,我的外部循环是while循环,内部循环是for循环,但是您当然可以使用您喜欢的任何方法来完成它

function getInitials() {
  var len = data.room.length;
  while (len--) {
    var staffArray = data.room[len].StaffList;
    var room = data.room[len].id;
    for (var i = 0; i < staffArray.length; i++) {
      var person = staffArray[i];
      if (person.initials) {
        setInitials(room, person.initials);
      }
    }
  }
}

function setInitials(room, initials) {
  var staffContainer = document.getElementById("div" + room);
  if (staffContainer != null) {
    var newDiv = document.createElement("div");
    newDiv.innerHTML = initials;
    staffContainer.appendChild(newDiv);
  }
}
第一组{ 背景颜色:白肋木; } 第二组{ 背景颜色:深红色; } div{ 高度:自动; 宽度:50px; 填充:3倍; 保证金:2倍; }