문제

나는 JSON이 다음과 같이 가지고있다 :

[
  {
     platformId: 1,
     payout: 15,
     numOfPeople: 4
  },
  {
     platformId: 1,
     payout: 12,
     numOfPeople: 3

  },
  {
     platformId: 2,
     payout: 6,
     numOfPeople: 5

  },
  {
     platformId: 2,
     payout: 10,
     numOfPeople: 1
  },

]
.

그리고 platformIdpayout의 합계로 numOfPeople로 그룹화하려고합니다.

i.e.결과적으로 JSON이 다음과 같이 원한다 :

[
  "1": {
     payout: 27,
     numOfPeople: 7
   },

  "2": {
     payout: 16,
     numOfPeople: 6
  }
] 
.

underscore.js_.groupBy 메소드를 사용하려고 시도했으며, IT 그룹이 괜찮아요.

도움이 되었습니까?

해결책

밑줄 없이이 작업을 수행 할 수 있습니다.

var result = data.reduce(function(acc, x) {
  var id = acc[x.platformId]
  if (id) {
    id.payout += x.payout
    id.numOfPeople += x.numOfPeople
  } else {
    acc[x.platformId] = x
    delete x.platformId
  }
  return acc
},{})
.

그러나 숫자 키가있는 객체를 왜 원하십니까?컬렉션으로 다시 변환 할 수 있습니다.

var toCollection = function(obj) {
  return Object.keys(obj)
    .sort(function(x, y){return +x - +y})
    .map(function(k){return obj[k]})
}

toCollection(result)
.

오브젝트가 돌연변이되므로 원래 데이터를 유지하려는 경우 먼저 복제 할 수 있습니다.

다른 팁

여기에 이러한 종류의 문제에 대한 Lodash 솔루션입니다.그것은 밑줄과 비슷하지만 몇 가지 고급 기능이 있습니다.

const data = [{
    platformId: 1,
    payout: 15,
    numOfPeople: 4
  },
  {
    platformId: 1,
    payout: 12,
    numOfPeople: 3

  },
  {
    platformId: 2,
    payout: 6,
    numOfPeople: 5

  },
  {
    platformId: 2,
    payout: 10,
    numOfPeople: 1
  },
];

const ans = _(data)
  .groupBy('platformId')
  .map((platform, id) => ({
    platformId: id,
    payout: _.sumBy(platform, 'payout'),
    numOfPeople: _.sumBy(platform, 'numOfPeople')
  }))
  .value()

console.log(ans);
.
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
.

나는 기능적인 방식으로 이것을하려고 노력했고 결과는 이렇게

console.log(_.chain(data)
    .groupBy("platformId")
    .map(function(value, key) {
        return [key, _.reduce(value, function(result, currentObject) {
            return {
                payout: result.payout + currentObject.payout,
                numOfPeople: result.numOfPeople + currentObject.numOfPeople
            }
        }, {
            payout: 0,
            numOfPeople: 0
        })];
    })
    .object()
    .value());
.

Lodash One Liners의 정신

_.map(_.groupBy(your_list, 'group_by'), (o,idx) => { return { id: idx, summed: _.sumBy(o,'sum_me') }})
.

a (내 의견으로) underscore.js를 사용하여 좋은 기능적인 방법 :

var sum = function(t, n) { return t + n; };
_.mapObject(
    _.groupBy(data, 'platformId'),
    function(values, platformId) {
        return {
            payout: _.reduce(_.pluck(values, 'payout'), sum, 0),
            numOfPeople: _.reduce(_.pluck(values, 'numOfPeople'), sum, 0)
        };
    }
);
.

//Input 
[{
  "platformId": 1,
  "payout": 15,
  "numOfPeople": 4
}, {
  "platformId": 1,
  "payout": 12,
  "numOfPeople": 3
}, {
  "platformId": 2,
  "payout": 6,
  "numOfPeople": 5
}, {
  "platformId": 2,
  "payout": 10,
  "numOfPeople": 1
}]


//Output
{
 "1": {
    "payout": 43,
    "numOfPeople": 13
 },
 "2": {
    "payout": 43,
    "numOfPeople": 13
 }
}


// Code
output = _.reduce(input, function(acc, val, key) {
  acc[val.platformId] = {
     payout: _.sum(a, 'payout'),
     numOfPeople: _.sum(a, 'numOfPeople')
   };
  return acc;
  }, {});
.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top