将Javascript Arrays组合成键值查找

时间:2016-05-27 18:18:10

标签: javascript arrays key-value

我有一个名为Data的Javascript对象,如下所示:

Object {
  zip: Array[14631],
  lat: Array[14631],
  lng: Array[14631],
  surge: Array[14631]
}

数据看起来像

Zipcode, Lat,    Lng,    Surge
10025,   47.323, -93.43, 1.7

因此,要访问元素,我可以执行以下操作: data['zip'][i]它将返回zip数组的'ith'元素。 我可以对所有阵列做同样的事情。

我想要的是一个数据结构,以便我可以这样做: data[10025]它将返回其他数组中的所有匹配元素。 因此,假设我有5个条目,其中zipcode = 10025,数据[10025]将返回:

10025,lat_1,lng_1,surge_1
10025,lat_2,lng_2,surge_2
10025,lat_3,lng_3,surge_3
10025,lat_4,lng_4,surge_4
10025,lat_5,lng_5,surge_5

这样我就可以通过

进行双重迭代
for zip in data['zip']{
  for i in data[zip] {
    print data[zip]['lats'][i]
  }
}

我认为这是一个简单的问题,但我对javascript没有多少经验,似乎无法得到它。非常感谢任何帮助。

另一种表达方式的方法是我想要一个看起来像这样的对象:

    data[array size of N]

该数组的每个元素都包含3个大小为M

的数组

3 个答案:

答案 0 :(得分:2)

为什么不这样做......

data = {
    "10025": [
        {
            "Lat": 47.323,
            "Lng": -93.43,
            "Surge": 1.7
        },{
            "Lat": 47.323,
            "Lng": -93.43,
            "Surge": 1.7
        },{
            "Lat": 47.323,
            "Lng": -93.43,
            "Surge": 1.7
        }
    ]
};

然后你可以通过数据[" 10025"]访问zip并循环遍历各个位置。

var data = {};
for(var i = 0; i < obj.zip.length;i++){
    var zip = obj.zip[i]
    data[zip] = data[zip] || [];
    data[zip].push({
        zip: obj.zip[i],
        lat: obj.lat[i],
        lng: obj.lng[i],
        surge: obj.surge[i]
    });
}

答案 1 :(得分:2)

在不更改原始数据的情况下,您可以将新数组中的数组索引用于以邮政编码为键的对象。

data = {
    "10025": [ 2, 4, 7, 10],
    "10027": [ 1, 3, 9, 11],
};

使用

生成数据
var data = Object.create(null); // create empty object

object.zip.forEach(function (z, i) {
    data[z] = data[z] || [];
    data[z].push(i);
});

访问权限是:

data[zip].forEach(function (index) {
    // do something with the value ...
    var lat = object.lats[index]
});

答案 2 :(得分:0)

// Array, keyed by zip code
var zip_array = [];

// Iterate over zip data, building zip_array as we go.
var zip_data = data.zip;
for (var i = 0, len = zip_data.length; i < len; ++i)
{
    var current_zip = zip_data[i];
    if (zip_array[current_zip]){
      zip_array[current_zip].push(getDataAt(i));
    }
  else {
    zip_array[current_zip] = [ getDataAt(i) ];
  }
}

function getDataAt (index)
{
  return [ data.zip[index], data.lat[index], data.lng[index], data.surge[index]].join(",");
}