簡體   English   中英

遍歷數組以使用Javascript創建對象

[英]Looping through an array to create an object in Javascript

我想編寫一個函數,該函數需要一個數組,例如:

var columns = ['distance', 'times', 'acceleration']

然后從這個數組,我想生成這樣的東西:

[{id: id_0, distance: 0, times: 0, acceleration: 0}, {id: id_1, distance: 1, times: 1, acceleration: 1}]

請注意,這里有2個對象,但我希望它是我傳遞給參數的任何數字。 這是我所擁有的:

generateData: function(rows, columns) {
  var generatedData = [];
  for (var i = 0, rowLen = rows.length; i < rowLen; i++) {
    for (var n = 0; i < columns.length; n++) {
      // not sure how to construct an object here from looping through my columns array
      generatedData.push({
      id: 'id_ + n',
      // confused here
      });
    }
  return generatedData;
  }
}

這是動態創建自己的函數的理想場所。 嘗試這個:

function createArrayOfObjects(columns, count) {
  var objectProps = new Array(columns.length);
  for (var i = 0; i < columns.length; i++){
    //":j" will be the variable j inside the dynamic function
    objectProps[i] = columns[i] + ":j";
  }

  var funcBody = "var arr = new Array(count);" +
      "for(var j = 0; j < count; j++){" +
          "arr[j] = {" + objectProps.join(',') + "};" +
      "}" +
      "return arr;";

  //Create a new function and call it with count as the parameter, returning the results
  return new Function("count", funcBody)(count);
}

var count = 10;
var columns = ['distance', 'times', 'acceleration'];

createArrayOfObjects(columns.concat('id'), count);

這樣做的好處是,在其他解決方案需要嵌套循環的情況下,只需循環一次column數組即可。

JSPerf

我正在向您贈送最初的非優化解決方案。 由您決定進行優化。

generateData: function(rows, columns) {
  var generatedData = [];
  for (var i = 0; i < rows.length; i++) {
      var myObj = {};
      myObj["id_" + i] = i;
      for (var n = 0; n < columns.length; n++) {
          myObj[columns[n]] = i;
      }
      generatedData.push(myObj);
  }
  return generatedData;
}

一種功能性的方法將從傳遞的數組中獲取對象屬性,而不是對其進行硬編碼,而在for循環中可能看起來像這樣,以使用名稱為array的值填充屬性來填充名為“ rows”的數組'cols':

cols.forEach(function(cv, ci, ca) { rows[ri][cv] = ri; });

有關完整示例,請參見代碼段。 請注意,在此示例中,我只是將“行”的當前索引推入對象作為屬性值。

 var columns = ['distance', 'times', 'acceleration']; function generateData(numRows, cols) { rows = new Array(numRows); for(ri=0; ri < rows.length; ri++) { rows[ri] = { id: ri }; cols.forEach(function(cv, ci, ca) { rows[ri][cv] = ri; }); } return rows; } data = generateData(5, columns); console.log(data); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM