Разбор файла JSON в массив, везде помещает только последнее прочитанное значение - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть следующий код, который в основном читает файл 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]
    }
}

Проблема в том, что myArray заполняется ВЕЗДЕ последним значением в файле JSONдаже console.log показывает хорошие значения / индексы / и т.д ...

Я новичок в 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;
}

И, очевидно, все это по ссылке, поэтому последнее значение, которое я присвоил myArray при чтении data1, обновило их все.Изменено на:

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();
    }
}

И это прекрасно работает (возможно, есть более подходящее решение для инициализации массива, чем этот сингл + двойной цикл)

Еще раз спасибо, ребята!: D

1 Ответ

0 голосов
/ 30 декабря 2018

Я предполагаю, что вы пытаетесь создать какой-то объект, который содержит несколько массивов?

Если это так, вы могли бы сделать что-то подобное?

Редактировать

Прочитав некоторые комментарии и еще много чего, ваша проблема заключается в том, что вы продолжаете перезаписывать значение 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);

Edit 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 ++, возможно, читая такие страницы, как , этот может иметь некоторыеПомогите?

Опять же, вы новичок в JavaScript, я не буду делать никаких предположений относительно ваших навыков или умений писать JavaScript.Сам я изначально изучил Java как свой первый язык, поэтому изучение обратного пути JavaScript было немного запутанным для меня, например, когда class не было чем-то особенным, вы должны были определить класс с функцией, которая не былане имеет большого значения, но это всего лишь одна из этих вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...