首页 > 解决方案 > 如何限制每个函数的数量?

问题描述

我有以下对象:

"data": [
  {
   "label": "dataName",
   "sections": [
     {
      "label": "label sections 1",
      "fields": [
         {
          "id": 1,
          "name": "field 1",
          "value": "value field 1"
         },
         {
          "id": 2,
          "name": "field 2",
          "value": "value field 2"
         }
        ]
      },
    {
      "label": "label sections 2",
      "fields": [
        {
         "id": 5,
         "name": "field 3",
         "value": "value field 3"
        }
       ]
     }
   ]

我想通过从每个字段中检索数据来创建一个新数组。

像这样 :

  array [
      {id: field.id, name: field.name, value: field.value }
      {id: field.id, name: field.name, value: field.value }
  ]

我想我会像这样使用每个功能:

    _.each(data, function (elt) {
            _.each(elt.ections, function (elt) {
            ....
         })
     });

但是使用每个函数我应该将每个函数相乘。

有没有一种解决方案可以在不使用多个函数的情况下获得相同的结果?

如果你有解决方案?

亲切地

标签: javascriptlodash

解决方案


使用 reduce 方法:

var reduceSections = data.reduce((a,b) => (a.concat(b.sections)),[]);
var reduceFields = reduceSections.reduce((a,b) => (a.concat(b.fields)),[]);
var result = reduceFields;
console.log(result);

有关详细信息,请参阅

演示

var data = [{
   "label": "dataName",
   "sections": [{
      "label": "label sections 1",
      "fields": [{
          "id": 1,
          "name": "field 1",
          "value": "value field 1"
      },{
          "id": 2,
          "name": "field 2",
          "value": "value field 2"
      }]
   },{
      "label": "label sections 2",
      "fields": [{
         "id": 5,
         "name": "field 3",
         "value": "value field 3"
      }]
   }]
}];
var reduceSections = data.reduce((a,b) => (a.concat(b.sections)),[]);
var reduceFields = reduceSections.reduce((a,b) => (a.concat(b.fields)),[]);
var result = reduceFields;
console.log(result);


唯一的缺点是改变原始数据对象会改变数组中的结果。(无浅层克隆)

这可能是也可能不是缺点,具体取决于应用程序。

如果要克隆对象:

var clone = result.map(obj => Object.assign({},obj));

有关详细信息,请参阅


推荐阅读