Не удается получить доступ к свойствам объекта?

#javascript #node.js #arrays #excel #xlsx

#javascript #node.js #массивы #excel #xlsx

Вопрос:

Я читаю лист, используя расширение SheetJS (xlsx) для чтения из файла Excel, например:

 var workbook = XLSX.readFile(req.file.path);
var sheet_name_list = workbook.SheetNames;
let sheet_json = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
  

Когда я запускаю console.log(sheet_json) , я получаю:

 [
  {
    'Question*': 'Question 1',
    'Number of Choices*': 2,
    'Choice A*': 'Apple',
    'Choice B*': 'Pineapple',
    'Answer (A/B/C/D)*': 'A',
    'Correct Marking*': 1,
    'Negative marking*': 0
  },
  {
    'Question*': 'Question 2',
    'Number of Choices*': 3,
    'Choice A*': 'Car',
    'Choice B*': 'Bike',
    'Choice C': 'Truck',
    'Answer (A/B/C/D)*': 'C',
    'Correct Marking*': 1,
    'Negative marking*': 1
  }
]
  

Теперь я перебираю массив sheet_json и не могу проверить свойства, результат такой:

 
// i is the index of iterator. o is the object iterated


   let sn = ["Question*", "Number of Choices*"]
   let props = Object.keys(sheet_json[i]);
   console.log(props); //===> false
   console.log(props.findIndex(o=>o==sn[1])) //===> false
   console.log(o.hasOwnProperty(sn[1])); //===> false
   console.log("Number of Choices*" in o); //===> false
   console.log(sn[1] in sheet_json[i]); //===> false
   console.log(props.includes(sn[1].trim().toString())); //===> false
   console.log(o["Number of Choices*"]); //===> undefined
   console.log(o[sn[1]]!==undefined);  //===> false

  

Почему все отображается как неопределенное или ложное? Пожалуйста, помогите.


node -v : версия 13.14.0

npm -v : 6.14.4

xlsx : 0.16


Вот также файл Excel: СКАЧАТЬ

Ответ №1:

Я попытался воспроизвести его здесь https://jsfiddle.net/t4ocdw67 /.

 sheet_json=[{...},{...}];
for(i in sheet_json)
{
    let o = sheet_json[i];
    let sn = ["Question*", "Number of Choices*"]
    .... //more code here
}
  

Кажется, все работает нормально, возможно, проблема с итерационной частью

Комментарии:

1. Вы не реплицировали его полностью. Пожалуйста, попробуйте прочитать его через зависимость sheetjs, тогда он будет полностью реплицирован. Кроме того, использование простого объекта JSON не создает проблемы, преобразование листа в json создает проблему.

2. Я попробовал это с помощью зависимости sheetjs. Преобразование листа в JSON — это не совсем проблема, я считаю, что проблема в кодировании . Наш обычный символ пробела (UTF8: x20) не равен символу пробела (UTF8: xc2xa0) в строке с помощью преобразования sheetjs. Чтобы воспроизвести это, вы можете скопировать текст из консоли терминала и использовать ссылку , чтобы проверить и найти другую кодировку UTF8. Также именно поэтому вы можете сделать все это для любого свойства без пробелов. Вы можете использовать массив props, полученный из sheet_json, с той же кодировкой.

3. Хорошо! Это имеет смысл. Но использование toString() при создании массива ключей также не помогает. Я попробую пару модулей кодировки utf-8, а затем сообщу. Между тем, если вы знаете решение, вы можете опубликовать его здесь!

4. Создал новый лист (проблема заключалась в пробелах), исправил проблему, проверил ее на упомянутом вами веб-сайте, и вы были правы! Пробелы между словами имели разные символы Юникода.