重新构造数组javascript

重新构造数组javascript,javascript,loops,dictionary,Javascript,Loops,Dictionary,我正在使用OpenLayers 3并制作弹出窗口。我想通过创建子数组,将从sql视图中获取的数组按顺序组织起来。我一直在研究树和$.map函数,但我仍然无法正确组织数据,因为数据库中的父/子关系在视图中丢失 这是一个数据示例(请注意,这是动态的;每个请求的数组都不同): 这就是我到目前为止所做的: pixel = map.getEventPixel(evt.originalEvent); map.forEachFeatureAtPixel(pixel, f

我正在使用OpenLayers 3并制作弹出窗口。我想通过创建子数组,将从sql视图中获取的数组按顺序组织起来。我一直在研究树和$.map函数,但我仍然无法正确组织数据,因为数据库中的父/子关系在视图中丢失

这是一个数据示例(请注意,这是动态的;每个请求的数组都不同):

这就是我到目前为止所做的:

          pixel = map.getEventPixel(evt.originalEvent);
          map.forEachFeatureAtPixel(pixel, function (feature, layer) {   
            var featureprops = feature.getProperties();  
          var array = $.map(featureprops, function(value, index) {
return {name:index, value:value};
});
console.log(array);

Object.defineProperty(Array.prototype, 'group', {
  enumerable: false,
  value: function (key) {
    var map = {};
    this.forEach(function (e) {
        if(e.name=='chemical_name') {
      var k = key(e);
      map[k] = map[k] || [];
      map[k].push(e);
  }
  if(e.name=='result_numeric') {
       var k = key(e);
       map[k] = map[k] || [];
       map[k].push(e);
   }
    if(e.name=='lab_qualifiers') {
       var k = key(e);
       map[k] = map[k] || [];
       map[k].push(e);
   }
     });
     return Object.keys(map).map(function (k) {
       return {key: k, data: map[k]};
     });
   }
 });

 var newArray = array.group(function (item) {   
   return item.chemical_name;
 });
 console.log(newArray);
 //other code follows
有没有更有效的方法来建立这个?此外,此函数现在仅返回第一个功能的属性。我需要为每个样本构建数组,并根据每个唯一的样本进行分组

我想要的输出是这样的

{  
name: 'samp1', 
results: [{
        key:'chemicalname', 
        value: foo1
    },{
        key: 'result',
        value: 16
    },{
        key: 'qualifier',
        value: 'X'
      },{
        key:'chemicalname', 
        value: foo
    },{
        key: 'result',
        value: 10
    },{
        key: 'qualifier',
        value: 'X'
      },{
        key:'chemicalname', 
        value: foo1
    },{
        key: 'result',
        value: 109
    },{
        key: 'qualifier',
        value: 'X'
      },{
        key:'chemicalname', 
        value: foo
    },{
        key: 'result',
        value: 418
    },{
        key: 'qualifier',
        value: 'A'
      }],
name: 'samp2', 
results: [{          
        key:'chemicalname', 
        value: foo1
    },{
        key: 'result',
        value: 411
    },{
        key: 'qualifier',
        value: 'AU'
      },{
        key:'chemicalname', 
        value: foo
    },{
        key: 'result',
        value: 4
    },{
        key: 'qualifier',
        value: 'Z'
      },{
        key:'chemicalname', 
        value: foo1
    },{
        key: 'result',
        value: 1
    },{
        key: 'qualifier',
        value: 'XY'
      }
}],
 name: 'samp3', 
results: [{          
        key:'chemicalname', 
        value: foo1
    },{
        key: 'result',
        value: 100
    },{
        key: 'qualifier',
        value: 'X'
      },{
        key:'chemicalname', 
        value: foo
    },{
        key: 'result',
        value: 140
    },{
        key: 'qualifier',
        value: 'AX'
      }],
name: 'samp4', 
results: [{  
        key:'chemicalname', 
        value: 'foo'
    },{
        key: 'result',
        value: 1478
    },{
        key: 'qualifier',
        value: 'XA'
      }]
} 

这是我最终使用的代码:

   var features = [];
    map.forEachFeatureAtPixel(pixel, function(feature, layer) {
      features.push(feature);
    });
    var samples = [];
for (var i = 0, ii = features.length; i < ii; i++) {samples.push({sample_name:features[i].get('sample_name'),sample_date:features[i].get('sample_date'),start_depth:features[i].get('start_depth'),end_depth:features[i].get('end_depth'),chemical_name:features[i].get('chemical_name'),result_numeric:features[i].get('result_numeric'),lab_qualifiers:features[i].get('lab_qualifiers')});
};

Array.prototype.groupBy = function(prop) {
  return this.reduce(function(groups, item) {
var val = item[prop];
groups[val] = groups[val] || [];
groups[val].push(item);
return groups;
}, {});
}

var data = samples.groupBy('sample_name');
console.log(data);
var功能=[];
map.forEachFeatureAtPixel(像素,功能(特征,层){
功能。推送(功能);
});
var样本=[];
对于(var i=0,ii=features.length;i

下一个任务是将对象转换为HTML表,但这超出了此问题的范围。

请包括预期输出
这是一个数据示例:
-数据示例如何,因为它在代码中。。。你说它是一个数组,但你展示的不是数组。你可以用一种在作业右侧有效的形式向我们展示你的起始数据和你想要的。数据是动态的,通过Geoserver从服务器中提取,但我会编一些虚拟数据。示例已更新,抱歉(我仍在学习:)
   var features = [];
    map.forEachFeatureAtPixel(pixel, function(feature, layer) {
      features.push(feature);
    });
    var samples = [];
for (var i = 0, ii = features.length; i < ii; i++) {samples.push({sample_name:features[i].get('sample_name'),sample_date:features[i].get('sample_date'),start_depth:features[i].get('start_depth'),end_depth:features[i].get('end_depth'),chemical_name:features[i].get('chemical_name'),result_numeric:features[i].get('result_numeric'),lab_qualifiers:features[i].get('lab_qualifiers')});
};

Array.prototype.groupBy = function(prop) {
  return this.reduce(function(groups, item) {
var val = item[prop];
groups[val] = groups[val] || [];
groups[val].push(item);
return groups;
}, {});
}

var data = samples.groupBy('sample_name');
console.log(data);