2017-11-10 1 views
0

NVD3 차트에서 사용할 JSON 데이터를 클라이언트에 보내는 Node.js API를 설정하려고합니다. 차트는 다음과 같은 형식으로 JSON 입력을 받아 들인다 :여러 하위 값 (Node.js/NVD3)이있는 JavaScript 배열 결합

[ 
    { 
     "key”:”SAME KEY NAME”, 
     "values":[ 
     1510148301000, 
     34 
     ] 
    }, 
    { 
     "key”:”SAME KEY NAME”, 
     "values":[ 
     1509626301000, 
     55 
     ] 
    }, 
    { 
     "key”:”SAME KEY NAME“, 
     "values":[ 
     1509539901000, 
     62 
     ] 
    }, 
    { 
     "key”:”DIFFERENT KEY NAME“, 
     "values":[ 
     1509453501000, 
     58 
     ] 
    } 
] 

내가와 동일 어떤 "키"인덱스를 결합하려는 :

[ 
    { 
     "key”:”KEY NAME“, 
     "values":[ 
     [ 
      1138683600000, 
      14.212410956029 
     ], 
     [ 
      1141102800000, 
      13.973193618249 
     ] 
     ] 
    }, 
    { 
     "key”:”KEY NAME“, 
     "values":[ 
     [ 
      1138683600000, 
      7.1590087090398 
     ], 
     [ 
      1141102800000, 
      7.1297210970108 
     ] 
     ] 
    } 
] 

그러나, 내 노드 프로그램은 현재이 형식으로 JSON 출력 다른 것들을 병합하고 "값"을 지정된 형식으로 서로 병합하십시오. 이 방법을 찾기 위해 온통 검색했지만 각 방법은 "가치"색인 내에서 여러 쌍을 설명하지 못했습니다.

어떻게 할 수 있습니까?

감사합니다.

+0

이 배열의 값을 병합 또는 서로를 추가 하시겠습니까? – pirs

답변

0

Array.prototype.reduce을 사용하면 원래 배열의 항목을 항목의 키 - 값으로 고유하게 키 입력 된 객체로 누적 할 수 있습니다. 배열 대신에 Object를 남겨두면 Object.values을 사용하여 예제 출력과 같은 값 배열을 불러 낼 수 있습니다.

let data = [ 
 
    {"key":"A", "values":[1510148301000, 34]}, 
 
    {"key":"A", "values":[1509626301000, 55]}, 
 
    {"key":"A", "values":[1509539901000, 62]}, 
 
    {"key":"B", "values":[1509453501000, 58]}, 
 
    {"key":"B", "values":[1509453501001, 57]}, 
 
]; 
 

 
let combined = Object.values(data.reduce((accumulator, item) => { 
 
    if (!accumulator[item.key]) 
 
    accumulator[item.key] = {key: item.key, values: []}; 
 
    accumulator[item.key].values.push(item.values); 
 
    return accumulator; 
 
}, {})); 
 

 
console.log(combined);

+0

'Object.values'는 babel env와 작동합니까? 잘 모르겠다. .. – pirs

+0

@pirs Object.values는 v7.0 (1 년 전에 릴리스 됨) 이후 NodeJS에 있었는데 OP가 이전 NodeJS 인스턴스를 실행하고 있지 않다고 가정합니다. – rgthree

+0

나는 노드 v8.6에서'Object.entries'에 문제가 있었기 때문에 다소 가까이에있다. 건배 – pirs

0

나는 당신이 (? 병합) 원하는 것을 확실하지 않다, 그러나 그런 것 같다 :

function combine (obj) { 
    var combined = {} 
    for (let key in obj) { 
     if (obj.hasOwnProperty(key)) { 
     if (!!combined[key]) { 
      combined[key] = [].concat(combined[key], obj[key].values) // everything in one 
      // or 
      // combined[key].push(obj[key].values) // everything in distinct arrays 
     } else { 
      combined[key] = obj[key].values 
      // or 
      // combined[key] = [obj[key].values] // in distinct arrays 
     } 
     } 
    } 
    return combined 
    } 
0
var original=[{"key":"SAME KEY NAME","values":[1510148301000,34]},{"key":"SAME KEY NAME","values":[1509626301000,55]},{"key":"SAME KEY NAME","values":[1509539901000,62]},{"key":"DIFFERENT KEY NAME","values":[1509453501000,58]}]; 
var result=[]; 
var isAlreadyAdded=false; 

original.forEach(function(outerObj){ 
var newObj={}; 
var values=[]; 
    original.forEach(function(element) { 

     if(newObj["key"] !== outerObj.key){ 
      newObj["key"]=element.key; 
     values=[]; 
      values.push(element["values"]); 
     }else if(outerObj.key ===element.key){ 
     values.push(element["values"]); 
    } 

    }); 
    newObj["values"]=values; 
    var count=0; 
    result.push(newObj); 
}); 

var temp=[]; 
result=result.filter((x, i)=> { 
    if (temp.indexOf(x.key) < 0) { 
    temp.push(x.key); 
    return true; 
    } 
    return false; 
}) 
console.log(result);