循环遍历对象并查找指定的属性

时间:2017-06-16 13:40:09

标签: javascript angular

我有一个对象数组。典型的对象如下:

{
  id: x
  name: y
  employeeInfo: {
    employeeNumber: x
    startDate: x
  }
  salary: x
}

现在我正在尝试遍历它并获取名称,employeeNumber和salary。

要在循环中使用的列变量是:

public columns: Array<any> = [
  {title: 'id', name: 'id'},
  {title: 'employeeInfo.employeeNumber', name: 'employeeInfo.employeeNumber'},
  {title: 'salary', name: 'salary'}]

我正试图用

循环
item[column.name]

但当然这会导致item ['emplyeeInfo.employeeNumber'],这将导致未定义。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

您可以拆分列名称并缩小,例如:

column.name.split('.').reduce((res, part) => res[part], item)

split会返回一个数组(在我们的案例中为['employeeInfo', 'employeeNumber']),因此我们可以使用item作为initialValue reduce该数组。

  

reduce()方法对累加器和每个应用函数   数组中的元素(从左到右)将其缩小为单个元素   值。

答案 1 :(得分:1)

这样的事情:

&#13;
&#13;
var employees = [
  {
    id: 1,
    name: 'Charlie',
    employeeInfo: {
      employeeNumber: 123,
      startDate: '2017-01-23'
    },
    salary: 2500
  },
  {
    id: 2,
    name: 'John',
    employeeInfo: {
      employeeNumber: 456,
      startDate: '2017-02-26'
    },
    salary: 3500
  }
];

var columns = [
  {title: 'id', name: 'id'},
  {title: 'employeeInfo.employeeNumber', name: 'employeeInfo.employeeNumber'},
  {title: 'salary', name: 'salary'}
];
  
function buildTable() {
  var table = $("<table>");
  var header = $("<tr>");
  for(var i = 0; i < columns.length; i++) {
    header.append("<th>" + columns[i].title + "</th>");
  }
  table.append(header);
  for(var i = 0; i < employees.length; i++) {
    var employee = employees[i];
    var row = $("<tr>");
    for(var y = 0; y < columns.length; y++) {
      var properties = columns[y].name.split('.');
      var value = employee;
      for(var x = 0; x < properties.length; x++) {
        value = value[properties[x]];
      }
      row.append("<td>" + value + "</td>");
    }
    table.append(row);
  }
  $("#result").append(table);
}

buildTable();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你不能解析/拆分点上的名称,对于每个部分,你得到对象,获取它的属性并重复,同时有下一个要获取的属性?

答案 3 :(得分:0)

我最终使用&#34;简化&#34;做法。即过滤数组,抓住我需要的东西,把它放在一个新的对象中,把它放在一个临时数组中,最后用简单的数组替换复杂的数组。

答案 4 :(得分:0)

试试这个:

var myObject = {
  id: "x",
  name: "y",
  employeeInfo: {
    employeeNumber: "inner employeeNumber",
    startDate: "inner date",
  },
  salary: "x"
}

for(var id in myObject) {
   if(typeof myObject[id] === "object") {
      for(var innerId in myObject[id]){
         console.log(innerId + ": " + myObject[id][innerId]);
      }
   } else {
    console.log(id + " " + myObject[id]);
   }
}