我可以使用循环声明数组吗?

时间:2014-07-01 12:20:01

标签: javascript arrays

我有以下数组声明:

adminExam.detailTabInputData1 = [
   { id: 'examName', keys: 'Test Exam 1' },
   { id: 'published', keys: '2014-06-27' },
   { id: 'price', keys: '100' }
]

我想创建10到100个版本,稍作修改,如下所示:

// New data 2
adminExam.detailTabInputData2 = [
   { id: 'examName', keys: 'Test Exam 2' },
   { id: 'published', keys: '2014-06-29' },
   { id: 'price', keys: '200' },
]

是否可以使用函数或循环执行此操作?

2 个答案:

答案 0 :(得分:1)

由于您在对象上构建,我们可以使用方括号表示法" []"在该对象上创建动态命名的属性。在这种情况下,方括号符号" []"和点符号"。"是可以互换的。

例如:adminExam['detailTabInputData1']adminExam.detailTabInputData1拉出相同的对象属性。但由于方括号表示法使用字符串属性名称,因此我们可以将变量连接到其中以便动态地形成属性名称。

var adminExam = {}; // instantiate object
// source of data used to form dynamic object properties
var data = [[1, '2014-06-27', '100'], [2, '2014-06-29', '200'], [3, '2014-07-07', '300']];

// loop over data to build new, dynamic object properties
for ( var ii = 0, dataLen = data.length; ii < dataLen; ii++ ) {
    // concatenate first element of current data row into property name
    adminExam['detailTabInputData' + data[ii][0]] = [
        { id: 'examName', keys: 'Test Exam ' + data[ii][0] },
        { id: 'published', keys: data[ii][1] },
        { id: 'price', keys: data[ii][2] }
    ];
}

工作示例:http://jsfiddle.net/uf9Kd/(务必打开浏览器javascript控制台查看对象和属性。)

答案 1 :(得分:0)

你可以这样做。由于缺乏规格而有点尴尬,但我会尽力而为。

我通常会从建立只做一件事的小功能的角度来处理这个问题。你提到你想要数据略有变化,所以我先解决这个问题:

function rand(variance) {
  return Math.floor(Math.rand() * variance);
}

var baseDate = new Date();
function variableDate(seed) {
  var base = new Date(baseDate);
  base.setDate(base.getDate() + seed + rand(5));
  return base;
}

var basePrice = 100;
function price(seed) {
  return basePrice + seed;
}

var baseExamId = 1;
function examName(seed) {
  return 'Test Exam ' + (baseExamId + seed);
}

插入那些我们可以制作工厂方法的乐高积木:

function createItem(id, key) {
  // It is unclear why this data structure and property names were choosen.
  return { id: id, keys: key };
}

function createEntry(seed) {
  // Again it is unclear why an array was choosen over an object in this case.
  return [
    createItem('examName',  examName(seed)),
    createItem('published', variableDate(seed)),
    createItem('price',     price(seed))
  ];
}

现在我们最后循环并将新值分配给一个continer对象。

function createAdminExam(size) {
  var i, data = {};
  for (i = 0; i < size; i++) {
    data['detailTabInputData' + i] = createEntry(i);
  }
  return data;
}

var adminExam = createAdminExam(10);

有很多更有效的方法可以实现这种逻辑。大多数 混淆来自数据结构的选择。作为锻炼来 读者,试着想一想这可能有不同的方法 以及可以使用哪些替代数据结构来提高可读性 和/或表现。