2017-08-03 17 views
-1

私はOpenLayers 3と協力してポップアップを作成しています。子配列を作成することで、SQLビューから取得した配列を整理したいと思います。私はツリーと$ .map関数を調べてきましたが、データベースからの親子関係がビュー内で失われているため、データを適切に整理することができません。配列javascriptの再構築

これは(これは動的であることに注意してください;配列は、それぞれの要求と異なるものになります)データの例です。

var list = [ 
{samplename: "samp1", chemicalname: "foo1", result: 16, qualifier: "X"}, 
{samplename: "samp1", chemicalname: "foo", result: 10, qualifier: "X"}, 
{samplename: "samp1", chemicalname: "foo1", result: 109, qualifier: "X"}, 
{samplename: "samp1", chemicalname: "foo", result: 418, qualifier: "A"}, 
{samplename: "samp2", chemicalname: "foo1", result: 411, qualifier: "AU"}, 
{samplename: "samp2", chemicalname: "foo", result: 4, qualifier: "Z"}, 
{samplename: "samp2", chemicalname: "foo1", result: 1, qualifier: "XY"}, 
{samplename: "samp3", chemicalname: "foo1", result: 100, qualifier: "X"}, 
{samplename: "samp3", chemicalname: "foo", result: 140, qualifier: "AX"} 
{samplename: "samp4", chemicalname: "foo", result: 1478, qualifier: "XA"} 
]; 

これは私がこれまで持っているものです。

  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 

これをより効率的に構築する方法はありますか?また、この関数は最初のフィーチャのプロパティのみを返します。配列ごとにサンプルを作成し、それぞれのサンプルでグループ化する必要があります。

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); 

次の作業は、しかし、HTMLテーブルにオブジェクトを変換している:私が望む

出力は、これは私が使用して終了コードです

{ 
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' 
     }] 
} 
+1

期待される出力を含めてください – baao

+3

'これはデータの例です:' - コード内のデータの例はどうですか?あなたはそれが配列だと言っていますが、あなたが示したものは配列ではありません –

+0

あなたは、あなたの開始データとあなたが望むものを、割り当ての右側で有効な形式で表示できますか? – Jack

答えて

0

ようなものになるだろうそれはこの質問の範囲を超えています。