Javascript for()loop& arr.push()优化

时间:2015-06-22 17:16:23

标签: javascript arrays loops for-loop

我有一个数组,我想更改格式和键,实现我已经对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的了解很少,我的问题是如何通过优化代码来实现预期的结果。

非常感谢你的时间,为我的英语道歉。

5 个答案:

答案 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)

像这样。

&#13;
&#13;
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;
&#13;
&#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] );
    }
}