2016-10-18 1 views
0
다음

data1플랫 중첩 된 데이터가 중첩 된 데이터가 중첩 된 데이터를 처리 할 수있는 방법이 있는지, 즉합니다 (<code>Amcharts</code>에서 허용되지 않기 때문에

var data1 = [{ 
"Date": "2016-07-09", 
"StockList": [{"Name": "H1", "PNL2": 20, "NAV2" : 20}, {"Name": "H2", "PNL2": 20, "NAV2" : 20}] 
"NAV": 26.28, 
"PNL": 7.61 
}, { 
"Date": "2016-07-10", 
"StockList": [{"Name": "H1", "PNL2": 20, "NAV2" : 20}, {"Name": "H2", "PNL2": 20, "NAV2" : 20}] 
"NAV": 27.55, 
"PNL": 12.89 
}]; 

의 구조 Amcharts 더 좋음), 최상위 오브젝트로 플랫 할 수 있습니까? (원래의 입력 데이터는 변경할 수 없습니다.) 예를 들면 다음과 같은 Amcharts 코드에서

var data1 = [{ 
"Date": "2016-07-09", 
"H1_PNL2": 20, 
"H1_NAV2" : 20 
"H2_PNL2": 20, 
"H2_NAV2" : 20, 
"NAV": 26.28, 
"PNL": 7.61 
}, { 
"Date": "2016-07-10", 
"H1_PNL2": 20, 
"H1_NAV2" : 20 
"H2_PNL2": 20, 
"H2_NAV2" : 20, 
"NAV": 27.55, 
"PNL": 12.89 
}]; 

가 : 여기

var dataSet1 = new AmCharts.DataSet(); 
dataSet1.color = "#b0de09"; 
//create your field mappings for each valueField 
dataSet1.fieldMappings = valueFields.map(function(valueField) { 
    return { 
    fromField: valueField, 
    toField: valueField 
    }; 
}); 
dataSet1.dataProvider = data; 
dataSet1.categoryField = "Date"; 

chart.dataSets = [dataSet1]; 

// PANELS 
var stockPanel = new AmCharts.StockPanel(); 
stockPanel.showCategoryAxis = true; 
stockPanel.title = "PNL2"; 
stockPanel.eraseAll = false; 
//stockPanel.addLabel(0, 100, "Click on the pencil icon on top-right to start drawing", "center", 16); 

//create a graph for each valueField 
valueFields.forEach(function(valueField) { 
    var graph = new AmCharts.StockGraph(); 
    graph.title = valueField; 
    graph.valueField = valueField; 
    graph.bullet = "round"; 
    graph.bulletColor = "#FFFFFF"; 
    graph.bulletBorderColor = "#00BBCC"; 
    graph.bulletBorderAlpha = 1; 
    graph.bulletBorderThickness = 2; 
    graph.bulletSize = 7; 
    graph.lineThickness = 2; 
    graph.lineColor = "#00BBCC"; 
    graph.useDataSetColors = false; 
    stockPanel.addStockGraph(graph); 
}); 

chart.addPanel(stockPanel); 
chart.write("chartdiv"); 
} 

createStockChart(data1); 

내 데이터 구조

[{,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…}, {,…},…] 
    [0 … 99] 
    0:{,…} 
     CashLeft:0 
     Commission:0 
     Date:"/Date(1454428800000)/" 
     NAV:0 
     PNL:0 
     Performance:[{ 
     0:{Stock: {Symbol: "1044 HK", Close: 66.714, Date: "/Date(1454428800000)/"}, Position: 0,…} 
     1:{Stock: {Symbol: "1088 HK", Close: 10.9, Date: "/Date(1454428800000)/"}, Position: 0,…} 
     2:{Stock: {Symbol: "12 HK", Close: 35.955, Date: "/Date(1454428800000)/"}, Position: 0,…} 

입니다 그리고 여기 코드 나는 아래로

function createStockChart(data) { 
     var chart = new AmCharts.AmStockChart(); 

     data.forEach(function (data1) { 
      data1.Performance.forEach(function (stockItem) { 
       data1[stockItem.Symbol + "_PNL2"] = stockItem.PNL2; 
      }); 
      //the following are completely optional - AmCharts won't look at StockList, but if you 
      //want to conserve memory and don't need the StockList for anything else, you can remove 
      //it 
      data1.StockList.length = 0; //delete the StockList Array. Not necessary if you need it for something else 
      delete data1.StockList; //remove the property from the object if you want. Also not necessary. 
     }); 

쓰기이다 그러나 데이터를 볼 때 str 그것이 변경되지 않을 수도 있습니다. 어쩌면 여기에 주식 목록 (나는 이름 (Symbol)을 의미합니다)이 며칠 후에 변경 될 것입니다. 즉, 데이터의 속성이 주기적으로 변경된다는 것을 의미합니다. 요점?

답변

0

StockList에 항상 Name, PNL2NAV2이 있다고 가정하면 나머지 코드보다 먼저 데이터를 루프하여 속성과 값을 할당 할 수 있습니다.

data1.forEach(function(arrayElement) { 
    arrayElement.StockList.forEach(function(stockItem) { 
    arrayElement[stockItem.Name + "_PNL2"] = stockItem.PNL2; 
    arrayElement[stockItem.Name + "_NAV2"] = stockItem.NAV2; 
    }); 
    //the following are completely optional - AmCharts won't look at StockList, but if you 
    //want to conserve memory and don't need the StockList for anything else, you can remove 
    //it 
    arrayElement.StockList.length = 0; //delete the StockList Array. Not necessary if you need it for something else 
    delete arrayElement.StockList; //remove the property from the object if you want. Also not necessary. 
}); 

거기에서 이전 코드에서 나머지 코드를 실행할 수 있습니다.

데모 :

var data1 = [{ 
 
    "Date": "2016-07-09", 
 
    "StockList": [{ 
 
    "Name": "H1", 
 
    "PNL2": 20, 
 
    "NAV2": 20 
 
    }, { 
 
    "Name": "H2", 
 
    "PNL2": 20, 
 
    "NAV2": 20 
 
    }], 
 
    "NAV": 26.28, 
 
    "PNL": 7.61 
 
}, { 
 
    "Date": "2016-07-10", 
 
    "StockList": [{ 
 
    "Name": "H1", 
 
    "PNL2": 20, 
 
    "NAV2": 20 
 
    }, { 
 
    "Name": "H2", 
 
    "PNL2": 20, 
 
    "NAV2": 20 
 
    }], 
 
    "NAV": 27.55, 
 
    "PNL": 12.89 
 
}]; 
 

 
data1.forEach(function(arrayElement) { 
 
    arrayElement.StockList.forEach(function(stockItem) { 
 
    arrayElement[stockItem.Name + "_PNL2"] = stockItem.PNL2; 
 
    arrayElement[stockItem.Name + "_NAV2"] = stockItem.NAV2; 
 
    }); 
 
    //the following are completely optional - AmCharts won't look at StockList, but if you 
 
    //want to conserve memory and don't need the StockList for anything else, you can remove 
 
    //it 
 
    arrayElement.StockList.length = 0; //delete the StockList Array. Not necessary if you need it for something else 
 
    delete arrayElement.StockList; //remove the property from the object if you want. Also not necessary. 
 
}); 
 

 
console.log(data1);

+0

가'은'data'을 무슨 소용이 있지만, 여기에'기능 (데이터)를 것 같다? 원본은 왜'data'를 사용하는'data1'입니까? –

+0

forEach는 루프의 반복마다 콜백을 사용합니다. 첫 번째 매개 변수는 배열 자체의 요소입니다. [MDN의 Array.forEach 문서] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach). 매개 변수의 이름을 arrayElement로 변경하여 더 명확하게 만들었지 만 자바 스크립트에 익숙하지 않은 경우 먼저 익숙해지는 것이 좋습니다. – xorspark

+0

@ xorspark 죄송합니다. 내 코드에서 작동하지 않습니다. 업데이트 된 질문을 참조하십시오. –

관련 문제