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

How to make subarrays containing a same string from an 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

您可以使用对象对相似的项目进行分组:

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/

我想出了一个使用 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();

这将为您提供一个以标题为键的数组。

将数据分组 .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() 将对象转换为 "subarrays"

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