2016-11-17 2 views
2

Я создаю приложение с использованием React Native и хочу сделать <ListView> с заголовками разделов. Я слежу за несколькими сообщениями, которые описывают, как это сделать, и я столкнулся с странной проблемой:Длина массива неверна

Часть создания <ListView> состоит в том, чтобы создать два массива: один представляет собой массив идентификаторов для разделов и другой - массив массивов, состоящий из идентификаторов строк. Два массива на их верхнем уровне должны иметь одинаковое количество элементов в них.

Я создаю массивы из JSon данных:

[ 
    { 
    "id": 12, 
    "name": "Surfhouse 1", 
    "guests": [ 
     { 
     "id": 100, 
     "name": "Oliver Nicholson", 
     "email": "[email protected]", 
     "age": "32" 
     }, 
     { 
     "id": 101, 
     "name": "Nollie Bollie", 
     "email": "[email protected]", 
     "age": "20" 
     }, 
     { 
     "id": 102, 
     "name": "Wootang", 
     "email": "[email protected]", 
     "age": "57" 
     } 
    ] 
    }, 
    { 
    "id": 25, 
    "name": "Surfhouse 2", 
    "guests": [ 
     { 
     "id": 200, 
     "name": "Alycia Woot", 
     "email": "[email protected]", 
     "age": "32" 
     }, 
     { 
     "id": 201, 
     "name": "Tim Jang", 
     "email": "[email protected]", 
     "age": "20" 
     }, 
     { 
     "id": 202, 
     "name": "Hootenany Yeah", 
     "email": "[email protected]", 
     "age": "57" 
     } 
    ] 
    } 
] 

и это, в свою очередь, отображается с помощью следующей функции (где accommodation является импортируемыми данными JSON):

const formatDataForListView = accommodation => { 
     const dataBlob = {}; 
     const sectionIDs = []; 
     const rowIDs = []; 

     accommodation.forEach((accom) => { 
     sectionIDs.push(accom.id); 
     dataBlob[accom.id] = accom.name; 
     rowIDs[accom.id] = []; // initialise empty array associated with Section ID 
     accom.guests.forEach((guest) => { 
      rowIDs[accom.id].push(guest.id); 
      dataBlob[accom.id + ':' + guest.id] = guest; 
     }); 
     }); 

Everything Кажется, все в порядке: я получаю ожидаемые массивы, но по какой-то причине массив RowIDs имеет length: 26, когда (я считаю) это должно быть только 2.

enter image description here

Каким образом массив rowIDs имеет длину 26?

ответ

1

Поскольку у вас есть значение по индексу 12 и по индексу 25. Это делает length из массива из 26, потому что он принимает наибольший индекс и добавляет один для длины, потому что массив основан на нуле.

Если вы хотите только два элемента, используйте индекс 0 и 1 без каких-либо предметов или используйте объект с ключами.

Для более углубленного чтения: Relationship between length and numerical properties

+1

Хорошо, да, Гоча. Благодарю. –

0

Я хотел бы предложить, что ROWIDs должен лучше быть объектом. Интерициализация определенного индекса массива не является хорошей практикой, у нас есть объект для цели key => value. Если вы проинтегрируете определенный индекс в массиве, он установит все предыдущие индексы как неопределенные, что не очень хорошо. Реализация с использованием объектов будет выглядеть в простом JavaScript -

var data = [ 
 
    { 
 
    "id": 12, 
 
    "name": "Surfhouse 1", 
 
    "guests": [ 
 
     { 
 
     "id": 100, 
 
     "name": "Oliver Nicholson", 
 
     "email": "[email protected]", 
 
     "age": "32" 
 
     }, 
 
     { 
 
     "id": 101, 
 
     "name": "Nollie Bollie", 
 
     "email": "[email protected]", 
 
     "age": "20" 
 
     }, 
 
     { 
 
     "id": 102, 
 
     "name": "Wootang", 
 
     "email": "[email protected]", 
 
     "age": "57" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "id": 25, 
 
    "name": "Surfhouse 2", 
 
    "guests": [ 
 
     { 
 
     "id": 200, 
 
     "name": "Alycia Woot", 
 
     "email": "[email protected]", 
 
     "age": "32" 
 
     }, 
 
     { 
 
     "id": 201, 
 
     "name": "Tim Jang", 
 
     "email": "[email protected]", 
 
     "age": "20" 
 
     }, 
 
     { 
 
     "id": 202, 
 
     "name": "Hootenany Yeah", 
 
     "email": "[email protected]", 
 
     "age": "57" 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
var rowIDs = {}; 
 
    
 
data.forEach(function(element) { 
 
    rowIDs[element.id] = []; 
 
    element.guests.forEach(function(guest) { 
 
     rowIDs[element.id].push(guest.id); 
 
    }); 
 
}); 
 
console.log(rowIDs);

+0

Ты мертв. Благодаря :-) –

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