将JSON文件解析为数组,仅将最后读取的值放到任何地方

时间:2018-12-30 10:35:34

标签: javascript arrays parsing

我有以下代码,基本上是读取JSON文件,然后将其放入多维数组中。

let fs1 = require('fs');
let root1 = fs1.readFileSync('myFile.json');
let data1 = JSON.parse(root1);

for(index1 in data1){
    for(index2 in data1[index1]){
        console.log(index1)
        console.log(index2)
        console.log(data1[index1][index2])
        myArray[index1][index2] = data1[index1][index2]
    }
}

问题在于,即使在console.log中,myArray仍被JSON文件中的最后一个值填充到了所有位置。

我是JS,这很新,所以欢迎大家帮助:D

提前谢谢! 胡安

编辑:

终于解决了。问题出在myArray声明中。 之前是这样的:

let v = [];
for (i = 0; i < n ; i++){
    v[i] = 0;
}
let myArray = [];
for (i = 0; i < n ; i++){
    myArray[i]= v;
}

显然,所有这些都是通过引用完成的,因此我在读取data1时分配给myArray的最后一个值更新了所有这些值。 更改为:

let myArray = {};
for (i = 0; i < n ; i++){
    myArray[i]= new Array();
}
for (i = 0; i < n ; i++){
    for (j = 0; j < n ; j++){
        myArray[i][j]= new Array();
    }
}

这很好用(可能有更好的解决方案 初始化数组,而不是此单+双for循环)

再次感谢大家! :D

1 个答案:

答案 0 :(得分:0)

我假设您正在尝试创建某种对象,其中包含一些数组?

如果是这样,您可以这样做吗?

编辑

在通读了一些评论之后,您遇到的问题是您继续覆盖myArrray[index1][index2]的值,而应该执行类似我的解决方案的操作,在外部循环中检查,看是否myArrray[index1],如果不是,则将其分配为数组或对象,然后担心其他键(也称为index2)。

使用map方法,至少您不必担心检查myArrray[index1]是否是数组,因为map只会返回一个数组。

const myArray = {};

// Object containing arrays example.
const dummyData1 = {
  'array1': [1, 2, 3, 4],
  'array2': [1, 2, 3, 4]
  // etc...
};

Object.keys(dummyData1).forEach(key => {
  myArray[key] = dummyData1[key].map(data => data);
});

console.log(myArray);


// Object containing objects example. 
const dummyData2 = {
  'object1': {
    id: 1,
    name: 'foo'
  },
  'object2': {
    id: 2,
    name: 'bar'
  }
  // etc...
};

Object.keys(dummyData2).forEach(key => {
  myArray[key] = { ...dummyData2[key]};
});

console.log(myArray);


// Another example for the lols. 
const dummyData3 = {
  'arrayx': [1, 2, 3],
  'arrayz': [4, 5, 6]
  // etc...
};

Object.keys(dummyData3).forEach(key => {
  myArray[key] = [...dummyData3[key]];
});

console.log(myArray);

编辑2

考虑到您似乎无法理解第一个编码示例,说句公道,就像您说过的那样,您是JavaScript的新手,因此您可能可以理解其中的一些内容,因为它要熟悉得多你的例子。

const myArray = {};
const data1 = {
  'array1': {
    a: 1,
    b: 2,
    c: 3
  },
  'array2': {
    d: 4,
    e: 5,
    f: 6
  }
};



for (let index1 in data1) {
  myArray[index1] = myArray[index1] || [];
  for (let index2 in data1[index1]) myArray[index1].push(data1[index1][index2]);
}

console.log(myArray);

编辑3

了解到您来自C ++背景,也许阅读诸如this之类的页面可能会有所帮助?

同样,您是JavaScript的新手,我不会对您的JavaScript技能或能力做任何假设。我本人最初是将Java作为第一语言学习的,所以在学习JavaScript回溯时有些困惑,例如class那时还不算什么,您必须定义一个带有函数的类,没什么大不了的,但这只是这些 之一。