如何将这些javascript对象解析为分组的2d数组?

时间:2012-11-09 01:51:49

标签: javascript arrays data-structures

javascript的新手,因此试图围绕使用不同的数据结构。

获得了一些对象,例如:

{id:1234, photo:"pathtosomejpg"}
{id:1234, photo:"pathtosomejpg2"}
{id:1234, photo:"pathtosomejpg3"}
{id:2234, photo:"pathtosomejpg4"}
{id:2235, photo:"pathtosomejpg5"}

在我完成循环后,我想获得一个以id为键的二维数组,该值是与该id匹配的所有photo值的数组

这是我尝试过的:

var groupedImages = [];
var innerAlbumPhotos = [];

// foreach obj in collection
if groupedImages.hasOwnProperty(obj.id.toString())
 innerAlbumPhotos = groupedImages[obj.id.toString()];

innerAlbumPhotos.push(obj.photo);

groupedImages[obj.id.toString()] = innerAlbumPhotos;

如何创建此处描述的数据结构?

3 个答案:

答案 0 :(得分:1)

尝试以下方法:

var results = [];
arr.forEach(function( v ) {
  var target = results[ v.id ];
  target 
    ? target.push( v.photo ) 
    : ( results[ v.id ] = [ v.photo ] );
});

演示: http://jsfiddle.net/elclanrs/YGNZE/4/

答案 1 :(得分:0)

我会为数组的每个元素使用一个循环。如果id不存在,我为它创建一个新数组,如果id存在,我将照片添加到它。

var data = [{id:1234, photo:"pathtosomejpg"},
    {id:1234, photo:"pathtosomejpg2"},
    {id:1234, photo:"pathtosomejpg3"},
    {id:2234, photo:"pathtosomejpg4"},
    {id:2235, photo:"pathtosomejpg5"}];

var result = [];
for (var i = 0; i < data.length; i++) {
    if (result[data[i].id]) {
        result[data[i].id].push(data[i].photo);
    } else {
        result[data[i].id] = [data[i].photo];
    }
}

答案 2 :(得分:0)

javascript中的数组没有键,所以如果你设置arr [1000] = 1,那么数组将有1000个元素。所以你应该使用一个对象。

var photo_index = {};
function indexPhoto( photo_object ){
  if( !photo_index[photo_object.id] )
    photo_index[photo_object.id] = [];
  photo_index[ photo_object.id ].push( photo_object.photo );
}

然后,为您所描述的所有对象调用indexPhoto。