2014-10-21 4 views
0

객체 배열이 있으며 데이터를 그룹화하고 요약하는 가장 효율적인 방법을 찾고 있습니다. 현재 저는 두 줄에 걸쳐 수백 줄의 코드와 '각 문장에 대한'문장이 많이 있습니다.이 작업을 수행하는 훨씬 쉬운 방법이 있다는 것을 알고 있지만, 제대로 작동하지는 않습니다.JavaScript 및 lodash를 사용하여 객체 배열에 대한 데이터를 요약하는 가장 좋은 방법

여기 내 데이터의 작은 샘플이 있습니다. 주어진 데이터 세트의 경우 수백 개의 제품이있을 수 있습니다. 각 제품에는 5 개의 별이 있으며 별에 3 개의 값 (획득, 미정 또는 진행 중) 중 하나를 지정할 수 있습니다. 나의 목표는 얼마나 많은 각 가치가 각 별에 할당되어 있는지에 대한 요약을 보는 것입니다.

[{ 
    Product: "A" 
    star1: "Not Earned" 
    star2: "In Progress" 
    star3: "Earned" 
    star4: "Not Earned" 
    star5: "In Progress" 
},{ 
    Product: "B" 
    star1: "In Progress" 
    star2: "Not Earned" 
    star3: "In Progress" 
    star4: "Earned" 
    star5: "Earned" 
}] 

는 결국이 같은 결과 것을 볼 것입니다 : 내가 도움을 부탁 해요 이유 하나 개 더 부분 조금 떨어져있는 개체와 배열의 내 서식을 실현. JavaScript와 lodash도 사용하고 있습니다.

Results= [{ 
    star1:{ 
     In Progress: 50, 
     Not Earned: 32, 
     Earned: 1 
    },{ 
    star2:{ 
     In Progress: 10 
     Not Earned: 14, 
     Earned: 11 
    },{ 
    star3:{ 
     In Progress: 45, 
     Not Earned: 25, 
     Earned: 19 
    }] 

어떻게하면됩니까?

+0

당신의 세트에 포함 된 모든 가능한 값을 ... 포함하면 나는 확실하지 않았다, 제로의 기본 수 있습니다 .. . – elclanrs

+0

그래서 더 많은 제품이 있으며 그 합은 얼마입니까? – elclanrs

+0

"주어진 데이터 세트의 경우 수백 개의 제품이있을 수 있습니다." 단지 수백 가지가 있다면, 세상에서 가장 빠른 방법을 사용하지 않고도 예쁜/게으름을 만들 수 있습니다. 이것은 밑줄을 잘 사용하는 것처럼 들립니다. 밑줄의 주셔서 감사합니다. – dandavis

답변

1

이렇게하는 것이 한 가지 방법 일 것입니다. 아마도 가장 빠르지는 않지만 작동하며 어떤 임시 변수도 생성하지 않습니다. (디노 브라우저 제외)를 실행하는 모든 라이브러리를 필요로하지 않는, 하나의 배열 var에 이름 (R) 이외의 데이터를 하드 코딩, 그것은 "간단한"의 아니에요 :

var r=[{ 
    Product: "A", 
    star1: "Not Earned", 
    star2: "In Progress", 
    star3: "Earned", 
    star4: "Not Earned", 
    star5: "Earned" 
},{ 
    Product: "B", 
    star1: "In Progress", 
    star2: "Not Earned", 
    star3: "In Progress", 
    star4: "Earned", 
    star5: "Earned" 
},,{ 
    Product: "C", 
    star1: "In Progress", 
    star2: "Not Earned", 
    star3: "Not Earned", 
    star4: "Earned", 
    star5: "In Progress" 
}]; 

var sums = {}; // A count holder 

Object.keys(r[0]).forEach(function(k){ // For each key in the data of a single data object 
    this[k]=r.map(function(o){ return o[k] }) // Pluck values 
     .map(function(w){ 
      if(this[w]){this[w]++;}else{this[w]=1;} // Count values using an object 
      return this; 
     },{}).pop(); // Take just one of the count object copies (poor-man's reduce with this) 
}, sums); 

// View result: 
JSON.stringify(sums, null, "\t") 
/* == { 
    "Product": { 
     "A": 1, 
     "B": 1, 
     "C": 1 
    }, 
    "star1": { 
     "Not Earned": 1, 
     "In Progress": 2 
    }, 
    "star2": { 
     "In Progress": 1, 
     "Not Earned": 2 
    }, 
    "star3": { 
     "Earned": 1, 
     "In Progress": 1, 
     "Not Earned": 1 
    }, 
    "star4": { 
     "Not Earned": 1, 
     "Earned": 2 
    }, 
    "star5": { 
     "Earned": 2, 
     "In Progress": 1 
    } 
*/ 

기본 개념을 각 키 아래의 모든 값을 뽑아 내고 값을 계산하는 것입니다. 이 2 패스 솔루션은 하드 코딩 된 단일 용도 루틴보다 약간 느릴 수 있지만 손으로 ​​코드화 된 축소 기능이 필요하지 않습니다. 필요한 경우

당신은 두 개의 예를 들어, 객체가 모두 그 숫자가 어디에서 오는지 내가 볼 수없는

+0

+1을해야한다고 생각합니다. 그냥 마음에 그 일반 자바 스크립트를 사용하여 구현하고 다를 수 있습니다. 환경의 일관성은 왜 내가 질문에 언급 된 로다시 라이브러리에 충실하기로 결정했는지입니다. – psaxton

+0

Object.keys(), [] .forEach 및 [] .map()은 모두이를 지원하는 브라우저에서 동일하게 작동하고 사양을 따르지 않는 브라우저에서는 polyfill을 사용합니다. 언더 코어/로다시는 비 제너릭 반복 (http://danml.com/mofun/#Performance의 r.map과 비교하여 \ _. map 및 U.map 참조) 및 \ _. isArray (\), 핵심 배열 반복 메소드 인 imho는 바닐라에서 "충분히 사용 가능"하여 제작에 사용합니다. – dandavis

+0

칭찬과 upvote, @ JSilva가 소집 할 수없는 것 :) 링크를 가져 주셔서 감사합니다. 당신의 mofun 라이브러리는 꽤 깨끗해 보입니다. – psaxton

0

"reduce"기능을 찾고 있습니다.

다음과 같은 것이 청구서에 표시됩니다. 물론이의

var products = [{ 
    Product: "A", 
    star1: "Not Earned", 
    star2: "In Progress", 
    star3: "Earned", 
    star4: "Not Earned", 
    star5: "In Progress", 
},{ 
    Product: "B", 
    star1: "In Progress", 
    star2: "Not Earned", 
    star3: "In Progress", 
    star4: "Earned", 
    star5: "Earned", 
}]; 

function countStars(accumulator, product) { 
    for(var prop in accumulator) { 
     accumulator[prop][product[prop]] += 1; 
    }; 

    return accumulator; 
} 

var starTemplate = { 
    "In Progress": 0, 
    "Not Earned": 0, 
    "Earned": 0, 
}; 

var initialAccumulator = { 
    star1: _.clone(starTemplate), 
    star2: _.clone(starTemplate), 
    star3: _.clone(starTemplate), 
    star4: _.clone(starTemplate), 
    star5: _.clone(starTemplate), 
}; 


var result = _.reduce(products, countStars, initialAccumulator); 

는 필요에 따라 몇 발전기 기능을 개선 할 수있다.