2014-10-17 5 views
2

데이터 배열 배열 형태로 서버에서 반환하는 테이블 형식의 데이터와 해당 데이터와 관련된 키 배열이 있습니다. 그런 다음 특정 키별로 정렬하고 싶습니다. 이제는 데이터를 사전 처리하고 객체 배열을 압축 할 수 있지만이를 수행하고 싶지는 않다는 것을 알고 있습니다. 이 작업을 쉽게 수행 할 수있는 기본 방법이 있습니까?배열 및 별도의 키 배열이있는 각도 배열

실제로 정렬하지 않지만 데이터를 표시하는 일부 코드입니다. CodePen.

JS :

var app = angular.module('helloworld', []); 

app.controller('TestController', function() { 
    this.headers = ['foo', 'bar']; 
    this.data = [ 
    [ 'lol', 'wut' ], 
    [ '123', 'abc' ] 
    ]; 

    this.predicate = ''; 
}); 

는 HTML :

참고로
<table ng-app="helloworld" ng-controller="TestController as test"> 
    <thead> 
    <tr> 
     <th ng-repeat="heading in test.headers" ng-click="test.predicate = heading">{{ heading }}</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr> 
     <td>Predicate:</td> 
     <td>{{ test.predicate }}</td> 
    </tr> 
    <tr ng-repeat="row in test.data | orderBy: test.predicate"> 
     <td ng-repeat="column in row">{{ column }}</td> 
    </tr> 
    </tbody> 
</table> 
+0

orderBy는 속성을 사용하여 방향을 정렬합니다. 배열에 "술어"속성이 없습니다. 필터링하려고합니까? – Antiga

+0

@Antiga, 나는 이것이 내가 코드가 실제로 아무 것도하지 않는다는 것을 명시한 이유임을 깨닫는다. 객체 배열을 미리 생성하면 작동하지만, 그렇게하지 않아도되는 영리한 방법이 있는지 궁금합니다. – Radu

+0

나는 당신이 지금 무슨 말을하고 있는지 이해하고 있다고 생각합니다. 개인적으로 Lo-Dash의 zipObject (https://lodash.com/docs#zipObject)와 같은 것을 사용 하겠지만, 그렇게하고 싶지는 않습니다. 희망하는 솔루션을 찾으십시오. – Antiga

답변

2

이 작업을 수행 할 수 있지만 대신 서버에서 json 개체 목록으로 데이터를 반환하도록 제안하는 것이 좋습니다.

다차원 배열을 정렬하려면 기본적으로 내부 배열의 인덱스를 기준으로 정렬합니다.

this.sorter = function(item){ 
    return item[test.predicate]; 
    } 

이 적용 : 귀하의 술어는

<th ng-repeat="heading in test.headers" 
    ng-click="test.predicate = $index"> 
      {{ heading }} 
</th> 

아래로 컨트롤러에 정렬 함수를 만듭니다 (귀하의 경우 0 또는 1 중 하나를)에 정렬 할 열의 인덱스를 개최 것 내가 당신을 위해 당신의 CodePen을 포크와 업데이트되었습니다

<tr ng-repeat="row in data | orderBy: test.sorter"> 

: http://codepen.io/anon/pen/qvcKD

로 아래에 해 orderBy 표현식으로 정렬
+0

정확히 내가 무엇을 찾고 있었습니까, 고마워요! 서버에서 반환하지 않는 이유는 항목 목록이 크기 때문에 요청 당 전송되는 데이터의 양이 크게 달라지기 때문입니다. 그런 말로 ... 압축이 그 일을 처리하는지 확인해야합니다. – Radu

0

어레이 함께 표준 JS로 압축 된 액 : LoDash와

var app = angular.module('helloworld', []); 

app.controller('TestController', function() { 
    this.headers = ['foo', 'bar']; 
    var data = [ 
    [ 'lol', 'abc' ], 
    [ '123', 'wut' ] 
    ]; 

    this.data = []; 

    for (var i = 0, n = data.length; i < n; i++) { 
    this.data.push({}); 
    for (var j = 0, m = this.headers.length; j < m; j++) { 
     this.data[i][this.headers[j]] = data[i][j]; 
    } 
    } 

    this.predicate = ''; 
}); 

대신 또는이 제안 @Antiga 작성 :

_.each(data, function(item) { 
    this.data.push(_.zipObject(this.headers, item)); 
}, this);