0

私はこのような配列を持っています:

[
{
    "title": "name",
    "value": ""
},
{
    "title": "version",
    "value": ""
},
{
    "title": "inventory_name",
    "value": ""
},
{
    "title": "inventory_version",
    "value": ""
},
{
    "title": "differed",
    "value": ""
},
{
    "title": "differed_name",
    "value": ""
},
{
    "title": "accept_error_while_reboot",
    "value": ""
},
{
    "title": "setup_check",
    "value": ""
},
{
    "title": "setup_install",
    "value": ""
},
{
    "title": "setup_install_partial",
    "value": ""
},
{
    "title": "params_install",
    "value": ""
},
{
    "title": "params_install_partial",
    "value": ""
},
{
    "title": "results_install_ok",
    "value": ""
},
{
    "title": "results_install_reboot_defered",
    "value": ""
},
{
    "title": "results_install_reboot_immediate",
    "value": ""
},
{
    "title": "results_install_partial_ok",
    "value": ""
},
{
    "title": "results_install_partial_reboot_defered",
    "value": ""
},
{
    "title": "results_install_partial_reboot_immediate",
    "value": ""
}
];

同じタイトル フィールド文字列を含むサブアレイを作成することは可能ですか?

たとえば、この場合、次のようになります。

array1 = [
 {
  "title": "differed",
  "value": ""
 },
 {
  "title": "differed_name",
  "value": ""
 }
]

array2 = [
 {
  "title": "setup_check",
  "value": ""
 },
 {
  "title": "setup_install",
  "value": ""
 },
 {
  "title": "setup_install_partial",
  "value": ""
 }
]

等々...

単一の要素の場合、次のものが必要です。

[
 {
 "title": "name",
 "value": ""
 }
]

私は一般的なアプローチを探しています。

たとえば、関数で使用できることはわかっていますが、indexOf('results')常にfilter同じタイトルであるとは限らないため、ハードコードを回避できるかどうかを知りたいです。

何か案は ?

フィドル

4

3 に答える 3

2

オブジェクトを使用して、同様のアイテムをグループ化できます。

var groups = {};

parameter_list.forEach(function(p){ 
   var key = p.title.split('_')[0];
   if(!groups[key]) {
      groups[key] = [];
   }
   groups[key].push(p);
});

実際のデモ: http://jsfiddle.net/t459o6v1/3/

于 2016-03-10T09:19:10.277 に答える
1

でデータをグループ化する.reduce()

var groups = data.reduce(function(result, currentValue) {
  var key = currentValue.title.split("_")[0];

  if (typeof result[key] === "undefined") {
    result[key] = [];
  }

  result[key].push(currentValue);

  return result;
}, {});

次に、(必要に応じて) を使用.map()してオブジェクトを「サブアレイ」に変換します

var subArrays = Object.keys(groups).map(function(key) {
    return groups[key];
});

var data = [{
  "title": "name",
  "value": ""
}, {
  "title": "version",
  "value": ""
}, {
  "title": "inventory_name",
  "value": ""
}, {
  "title": "inventory_version",
  "value": ""
}, {
  "title": "differed",
  "value": ""
}, {
  "title": "differed_name",
  "value": ""
}, {
  "title": "accept_error_while_reboot",
  "value": ""
}, {
  "title": "setup_check",
  "value": ""
}, {
  "title": "setup_install",
  "value": ""
}, {
  "title": "setup_install_partial",
  "value": ""
}, {
  "title": "params_install",
  "value": ""
}, {
  "title": "params_install_partial",
  "value": ""
}, {
  "title": "results_install_ok",
  "value": ""
}, {
  "title": "results_install_reboot_defered",
  "value": ""
}, {
  "title": "results_install_reboot_immediate",
  "value": ""
}, {
  "title": "results_install_partial_ok",
  "value": ""
}, {
  "title": "results_install_partial_reboot_defered",
  "value": ""
}, {
  "title": "results_install_partial_reboot_immediate",
  "value": ""
}];


var groups = data.reduce(function(result, currentValue) {
	var key = currentValue.title.split("_")[0];
  
  if (typeof result[key] === "undefined") {
  	result[key] = [];
  }
  
  result[key].push(currentValue);
  
  return result;
}, {});


var subArrays = Object.keys(groups).map(function(key) {
	return groups[key];
});

console.log(JSON.stringify(subArrays));

于 2016-03-10T09:23:23.683 に答える
1

を使用して解決策を思いつきましたが、おそらくorImmutable.JSで同様のことができます。これは機能的なバージョンであり、必須ではないことに注意してください。lodashunderscore

まず、プレフィックスを取得する関数を作成します。

function getPrefix(name) {
    var substr = name.substring(0, name.indexOf('_'))
    return substr ? substr : name;
}

次に、groupBy関数を使用します。

Immutable.fromJS(arr).groupBy(element => getPrefix( element['title']))
            .toJS();

これにより、タイトルをキーとする配列の配列が得られます。

于 2016-03-10T09:23:02.700 に答える