如何动态创建对象数组?

时间:2017-02-17 21:29:30

标签: javascript arrays sapui5 javascript-objects

我有一个对象数组,它是通过从csv文件中提取数据而创建的。该数组如下所示(打印时)。

Array[4]
0:Object
    value1:"200"
    value2:"95"
    value3:"6395"
    value4:"2"
1:Object
2:Object
3:Object

我创建它的方式如下。

var strCSV = e.target.result;
var arrCSV = strCSV.match(/[\w .]+(?=,?)/g);
var noOfCols = 4;

// To ignore the first row which is header
var hdrRow = arrCSV.splice(0, noOfCols);

var data = [];
while (arrCSV.length > 0) {
    var obj = {};
    // extract remaining rows one by one
    var row = arrCSV.splice(0, noOfCols)
    for (var i = 0; i < row.length; i++) {
        obj[hdrRow[i]] = row[i].trim();
    }
    // push row to an array
    data.push(obj)
}

现在让我们说我想要创建另一个对象数组,它们具有相同的数据值,但键不同。

var tableData = [
        {key1: "", key2: "", key3: "", key4: ""}];

我尝试过不同的方法,但我还没能做到。例如,我尝试了以下内容。

for(var i=0; i<data.length; i++){
    console.log(i);
    tableData[i]["key1"] = data[i].value1;
}

或类似形式的东西。我创建了一个空数组tableData = [],认为在现场创建元素可以解决问题,但它不会。反正有没有这样做?我不能只创建一个对象并逐个复制第一个数组中的所有元素,因为第一个数组中的元素数量可能是任何东西。

6 个答案:

答案 0 :(得分:2)

创建一个新对象,然后将其附加到tableData数组。

for(var i=0; i<data.length; i++){
    console.log(i);
    var newData = { "key1" : data[i].value1 };
    tableData.push(newData);
}

答案 1 :(得分:1)

// declare array
var tableData = []; 

for (...) {
    // create new object
    var obj = { key1: "", key2: "" }; 

    // add obj to array
    tableData.push(obj); 
}

答案 2 :(得分:1)

在您首次将对象放入tableData[i]["key1"]之前,您无法分配到tableData[i]

for(var i=0; i<data.length; i++){
    console.log(i);
    tableData[i] = {};
    tableData[i]["key1"] = data[i].value1;
}

您还可以组合对象初始化和属性赋值:

for(var i=0; i<data.length; i++){
    console.log(i);
    tableData[i] = {key1: data[i].value1};
}

答案 3 :(得分:1)

试试这个:

for(var i=0; i<data.length; i++){
    console.log(i);
    var obj = { "key1": data[i].value1, "key2": data[i].value2};
    tableData.push(obj);
}

答案 4 :(得分:1)

为什么不直接将csv标头中的密钥分配给对象?这样你只需要解析一次,不需要额外的循环和工作..

var csv = `foo,bar,baz\na,b,c\nd,e,f\ng,h,i`;

function parseCsv(str) {
  let split = str.split("\n");
  let header = split.shift().split(',');
  let res = [];

  split.forEach((line) => {
    let o = {};
    line.split(',').forEach((el, i) => {
      o[header[i]] = el;
    })
    res.push(o);
  });
  return res;
}

console.log(parseCsv(csv));

或者,如果您要分配不同的标题:

let csv = `foo,bar,baz\na,b,c\nd,e,f\ng,h,i`;
let header = ["head1", "head2", "head3"];
function parseCsv(str) {
  let split = str.split("\n");
  split.shift();
  let res = [];

  split.forEach((line) => {
    let o = {};
    line.split(',').forEach((el, i) => {
      o[header[i]] = el;
    })
    res.push(o);
  });
  return res;
}

console.log(parseCsv(csv));

答案 5 :(得分:1)

您可以使用以下代码创建随机对象和值的数组。 首先,使用 12 length 的位置创建数组,然后使用对象。

  data=Array.from({length:12},()=>(
    {id:Math.floor(Math.random()*(100-1))+1,
      name:Math.random().toString(36).substr(2,10)
    }
  )
)

console.log(data)