2017-01-26 4 views
0

У меня возникли проблемы с доступом к объекту объекта JSON. Я использую SheetJS для анализа файла excel и хранения его в виде массива объектов JSON. Эта часть отлично работает (функция getData()). Я хочу проанализировать этот массив и установить новое свойство, если свойство RunName начинается с «NK». Я попытался реализовать функцию setPriority(), но код не может найти свойство RunName, давая мне ошибку «неразрешенное имя переменной». Я добавил код и пример структуры массива ниже. Буду признателен за любую оказанную помощь. Спасибо :)Невозможно получить доступ к объекту объекта JSON

var url = "TestData.xlsx"; 
var oReq = new XMLHttpRequest(); 
oReq.open("GET", url, true); 
oReq.responseType = "arraybuffer"; 

function getData() { 

    oReq.onload = function (e) { 
     var arraybuffer = oReq.response; 

     /* convert data to binary string */ 
     var data = new Uint8Array(arraybuffer); 
     var arr = new Array(); 
     for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); 
     var bstr = arr.join(""); 


     /* Call XLSX */ 
     var workbook = XLSX.read(bstr, {type: "binary"}); 

     /* DO SOMETHING WITH workbook HERE */ 
     var first_sheet_name = workbook.SheetNames[0]; 
     var worksheet = workbook.Sheets[first_sheet_name]; 

     var array = XLSX.utils.sheet_to_json(worksheet, {raw: true}); 


     console.log(array); 


     setPriority(array); 


    }; 

    oReq.send(); 

} 


function setPriority(array) { 


    for (var i = 0; i < array.length; i++) { 

     switch (array[i].RunName) { 

      case (/NK/): 
       array[i].Priority = 2; 


     } 


    } 
} 

enter image description here

ответ

0

Try

switch (array[i].RunName.indexOf('NK')) { 

    case (0): 
     array[i].Priority = 2; 
} 

switch заявления оценивают выражение внутри скобок коммутатора, а затем попытаться соответствовать оценочному выражению против конкретных выражений, используя строгое сравнение, поэтому используя ===. Например, если мы имеем следующий код:

var i = 5; 
switch (i) { 
    case ("5"): 
    console.log("Five as string"); 
    break; 
    case (5): 
    console.log("Five"); 
    break; 
} 

Первый, i оценивается, в результате чего значение 5. Тогда выражения case оцениваются в каждом случае, сначала тестирование 5 === "5", что является ложным. Затем следующий, 5 === 5, что верно, поэтому выполняется код внутри блока case.

Я не уверен в регулярных выражениях и почему у вас есть ошибка, которую вы сделали, но в любом случае "NK" === /NK/ является ложным, поэтому он никак не будет соответствовать. Решение состоит в том, чтобы использовать выражение switch, которое оценивается в легко сравнимое значение, и соответственно создавать выражения case - поэтому в выражении switch мы проверяем индекс первого вхождения "NK", а если он встречается с индексом 0 - первый индекс строки - мы выполняем код внутри блока case.

+0

Это работает отлично. Спасибо! Не могли бы вы объяснить, где я поступил неправильно, и разница между тем, что я сделал, и вашим решением? Еще раз спасибо! –

+0

@DylanBaxter Добавлено некоторое объяснение - мои знания о регулярных выражениях и переключателях JS ограничены, но, надеюсь, он очищает хотя бы что-то до – Fissio

+0

Спасибо за объяснение, действительно помогает. Поскольку мне нужно проверить весь массив и установить другой приоритет для каждой группы (например, приоритет 1 для NK, приоритет 2 для NB и т. Д.), Мне нужно будет использовать регулярные выражения для проверки символов первого. В противном случае, последовательность утверждений if? –

Смежные вопросы