我有一个数组,我想更改格式和键,实现我已经对StackOverflow进行了一些研究,但仍未达到预期的效果
这是我的阵列:
var data = [{
timestamp: '1434569340',
close: '127.6100',
high: '127.7600',
low: '127.6050',
open: '127.7200',
volume: '337000' },
{ timestamp: '1434569641',
close: '127.5700',
high: '127.6701',
low: '127.5100',
open: '127.6100',
volume: '328200' }];
这就是我想要实现的目标:
var newData = [{
"t" : [1434569340, 1434569641], //timestamp
"c" : [127.6100, 127.5700], //close
"h" : [127.7600, 127.6701], //high
"l" : [127.6050, 127.5100], //low
"o" : [127.7200, 127.6100 ], //open
"v" : [337000, 328200] }]; //volume
目前我正在使用以下代码来更接近结果(在StackOverflow上的其他问题中看到):
var arr =[{}];
var len = data.length;
for (var i = 0; i < len; i++) {
arr.push(
data[i].timestamp );
}
for (var i = 0; i < len; i++) {
arr.push(
data[i].close );
}
结果显示上一段代码:
[Object, "1434569340", "1434569641", "1434569940", "1434570241", "127.6100", "127.5700", "127.5500", "127.4800", "127.7600", "127.6701", "127.6099"]
代码接近我需要的但是方法非常钝,应该继续编写代码来添加密钥等。 很明显,我对javascript的了解很少,我的问题是如何通过优化代码来实现预期的结果。
非常感谢你的时间,为我的英语道歉。
答案 0 :(得分:1)
function flip (arrOfObjs) {
var objOfArrs = {}; // make the object to return
arrOfObjs.forEach(function(obj){
for(var key in obj) {
objOfArrs[key] = objOfArrs[key] || []; // set the key to an array
objOfArrs[key].push(obj[key]); // add the value for this key of this object to the array
}
});
return objOfArrs;
}
然后你可以做var newData = [flip(data)]
并且你会得到一个包含一个对象的数组,每个键都是“timestamp”,“close”,“high”等。
答案 1 :(得分:1)
像这样。
function makeNewData(a, b) { // args: 2 arrays with same keys
var result = {};
var key, new_key;
for (key in a) {
if (a.hasOwnProperty(key) && b.hasOwnProperty(key)) { // check if both arrays have this key
new_key = key.charAt(0); // new key will be the first char of old key
result[new_key] = [a[key], b[key]]; // create array with 2 values
}
}
return result;
}
var data = [{
timestamp: '1434569340',
close: '127.6100',
high: '127.7600',
low: '127.6050',
open: '127.7200',
volume: '337000'
}, {
timestamp: '1434569641',
close: '127.5700',
high: '127.6701',
low: '127.5100',
open: '127.6100',
volume: '328200'
}];
console.log(makeNewData(data[0], data[1]))
&#13;
答案 2 :(得分:1)
功能性方法:
var newData = Object.keys(data[0]).reduce(function (res, key) {
res[key[0]] = data.map(function (item) { return item[key]; });
return res;
}, {});
使用Underscore / lo-dash pluck
稍微缩短版本:
var newData = Object.keys(data[0]).reduce(function (res, key) {
res[key[0]] = _.pluck(data, key);
return res;
}, {});
答案 3 :(得分:0)
<div style="height: 305px; width: 300px">
<carousel interval="myInterval">
<slide ng-repeat="slide in slides" active="slide.active">
<img ng-src="{{slide.image}}" style="margin:auto;height:300px">
<div class="carousel-caption">
<h4>Slide {{$index}}</h4>
<p>{{slide.text}}</p>
</div>
</slide>
</carousel>
</div>
答案 4 :(得分:0)
我能找到的最基本的是以下循环:
for( var i = 0, l = data.length; i<l; i++ )
{
for(var k in data[i])
{
if( !(k[0] in newData) )
{
newData[k[0]] = [];
}
newData[k[0]].push( data[i][k] );
}
}
这将创建所需的结构,但您应该按以下方式初始化变量:
var data = [
{
timestamp: '1434569340',
close: '127.6100',
high: '127.7600',
low: '127.6050',
open: '127.7200',
volume: '337000'
},
{
timestamp: '1434569641',
close: '127.5700',
high: '127.6701',
low: '127.5100',
open: '127.6100',
volume: '328200'
}
], newData = {};
使用数组存储单个对象是没有意义的。
如果需要,请使用以下循环:
for( var i = 0, l = data.length; i<l; i++ )
{
for(var k in data[i])
{
if( !(k[0] in newData) )
{
newData[0][k[0]] = [];
}
newData[0][k[0]].push( data[i][k] );
}
}