【问题标题】:How to make subarrays containing a same string from an array?如何从数组中创建包含相同字符串的子数组?
【发布时间】:2016-06-25 00:46:58
【问题描述】:

我有一个这样的数组:

[
{
    "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

【问题讨论】:

    标签: javascript arrays grouping sub-array


    【解决方案1】:

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

    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/

    【讨论】:

    • 你能解释一下if的声明吗?
    • 如果键不存在则创建一个空数组(第一次找到一个新组)。
    【解决方案2】:

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

    【讨论】:

      【解决方案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();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        • 2021-06-30
        • 2018-05-23
        • 1970-01-01
        • 2021-09-11
        相关资源
        最近更新 更多