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

我想出了一个使用 的解决方案Immutable.JS,但是您可能可以使用lodashor做类似的事情underscore。请注意,这是一个功能版本,不是必须的。

首先创建一个获取前缀的函数:

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 回答
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 回答