2017-10-10 3 views
1

배열 모양이 다음과 같습니다. 배열 배열 분할

const data = [ 
 
    ['list1'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
    ['list2'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
    ['list3'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
]
나는 & 목록 3은 어린이와 같은 항목을 포함리스트 2, 그 목록 1 그래서 더 구조화 된 컨테이너를 구축 & 목록 3과 빈 값리스트 2는 목록 1 사이의 모든 항목을 얻을 필요 . 예 :
const data2 = { 
 
    'list1': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'}, 
 
    'list2': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'}, 
 
    'list3': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'}, 
 
    'list4': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'} 
 
}

{

뭐죠 목록 헤더 사이의 아이템을 얻을 수있는 데이터 배열을 조회 할 수있는 가장 효율적인 방법은? 나는 lodash가 인덱스를 취하는 _.slice 메서드를 가지고 있지만 구분 기호로 배열의 값을 사용하는 방법을 볼 수 없다고 봅니다.

답변

2

이 시도 : 정의되지 않은에서 '1'을 검색 연산자 '에서'사용할 수 없습니다 :

const data = [ 
 
    ['list1'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '], 
 
    ['list2'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '], 
 
    ['list3'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
]; 
 

 
var result = {}; 
 
var lastList = null; 
 
for (var item of data) { 
 
    if (item.length == 1 && item[0] != ' ') { 
 
    result[item[0]] = lastList = {}; 
 
    } 
 

 
    else if (lastList != null && item.length == 2) { 
 
    lastList[item[0]] = item[1]; 
 
    } 
 
} 
 

 
console.log(result);

+1

두 번째'if'는'else if'입니까? – styfle

+0

@styfle 예, 성능에 도움이 될 것입니다. – Xiaoy312

+0

그래,이 트릭을 않습니다. 이전 답변보다 확실히 이해할 수 있습니다. 유일한 문제는 내 목록 이름과 항목 이름이 다를 수 있다는 것입니다. 즉, '목록'과 '항목'으로 시작하지 않습니다. – user1513388

2

주어진 키를 가진 마지막 객체에 대한 참조에 대한 클로저를 사용하여 전체 배열을 줄일 수 있습니다.

var data = [['list1'], ['item1', '1'], ['item2', '2'], ['item3', '3'], ['item4', '4'], [' '], ['list2'], ['item1', '1'], ['item2', '2'], ['item3', '3'], ['item4', '4'], [' '], ['list3'], ['item1', '1'], ['item2', '2'], ['item3', '3'], ['item4', '4'], [' ']], 
 
    result = data.reduce(function (ref) { 
 
     return function (r, a) { 
 
      if (1 in a) { 
 
       ref[a[0]] = a[1]; 
 
      } else if (a[0].trim()) { 
 
       r[a[0]] = {}; 
 
       ref = r[a[0]] 
 
      } 
 
      return r; 
 
     }; 
 
    }(undefined), {}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

내가 유형의 오류가'형식 오류를 얻을 ''if (1 in a)'줄에 입력하십시오. – user1513388

+0

@ user1513388, IE11에서도 작동합니다. 어디에서 오류가 발생합니까? –

+0

nodejS를 사용하고 있습니다. – user1513388