如何从数组中生成包含相同字符串的子数组?

时间:2016-03-10 09:11:08

标签: javascript arrays grouping sub-array

我有一个这样的数组:

[
{
    "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,但是如果可以避免使用硬编码,我也会这样做,因为它不是总是一样的头衔。

有什么想法吗?

Fiddle

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

我使用Immutable.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();

这将为您提供一组数组,其标题为其关键字。

答案 2 :(得分: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));