2016-06-30 2 views
1

У меня сложный массив с вложенными массивами. Например, если я хочу, чтобы получить данные из последнего массива, то я должен написать: partners[0].products[0].campaigns[0].nameCampaign или .type или .price т.д.Как сгладить вложенные массивы в JavaScript?

enter image description here

Я хотел бы, чтобы сгладить этот массив. И это то, что я ожидаю: enter image description here

Возможно ли вообще?


@EDIT Это часть console.log(JSON.stringify(partners, 0, 4));:

[{ 
    "_id": "57727902d0a069e41a34eece", 
    "namePartner": "Self", 
    "products": [{ 
     "_id": "57727910d0a069e41a34eed0", 
     "nameProduct": "Singl", 
     "campaigns": [{ 
      "_id": "57727937d0a069e41a34eed1", 
      "type": "lead", 
      "nameCampaign": "Camp 0" 
     }] 
    }, { 
     "_id": "5774cb68c594b22815643b37", 
     "nameProduct": "DrugiPartner" 
     "campaigns": [{ 
      "_id": "5774cb78c594b22815643b38", 
      "type": "subscription", 
      "nameCampaign": "DrugaKampania" 
     }, { 
      "_id": "5774cbedc594b22815643b3a", 
      "type": "subscription", 
      "nameCampaign": "TrzeciaKampania" 
     }, { 
      "_id": "5774cbf9c594b22815643b3b", 
      "type": "subscription", 
      "nameCampaign": "CzwartaKampania" 
     }] 
    }, { 
     "_id": "5774cbdbc594b22815643b39", 
     "nameProduct": "Trzeci" 
     "campaigns": [] 
    }] 
}] 
+0

может вы реальная структура объекта с помощью 'console.log (JSON.stringify (партнеры, 0, 4)); показать результат – RomanPerekhrest

+0

Ok Я отредактировал сообщение уже. – DiPix

ответ

2

В простом Javascript вы можете использовать массив со ссылками на нужные элементы и массивы и использовать итеративный рекурсивный подход для получения требуемого массива.

Редактировать

Для более одного свойства для добавления, вы можете использовать массив для более чем одного элемента.

одно свойство:

{ use: 'namePartner' } 

Множественные свойства:

{ use: ['nameCampains', 'type'] } 

function iter(a, r, l) { 
 
    if (Array.isArray(a)) { 
 
     a.forEach(function (b) { 
 
      var use = level[l].use, 
 
       rr = JSON.parse(JSON.stringify(r)); 
 
      (Array.isArray(use) && use || [use]).forEach(function (c) { 
 
       rr[c] = b[c]; 
 
      }); 
 
      iter(b[level[l].array], rr, l + 1); 
 
     }); 
 
     return; 
 
    } 
 
    result.push(r); 
 
} 
 

 
var partners = [{ namePartner: 'Tesco', products: [{ nameProduct: 'New', campains: [{ nameCampains: 'Apple', type: 'appleType' }, { nameCampains: 'Lenovo', type: 'lenovoType' }] }] }, { namePartner: 'Eko', products: [{ nameProduct: 'Fresh', campains: [{ nameCampains: 'Asus', type: 'asusType' }, { nameCampains: 'Dell', type: 'dellType' }] }, { nameProduct: 'new', campains: [{ nameCampains: 'Samsung', type: 'samsungType' }] }] }], 
 
    level = [{ use: 'namePartner', array: 'products' }, { use: 'nameProduct', array: 'campains' }, { use: ['nameCampains', 'type'] }], 
 
    result = []; 
 

 
iter(partners, {}, 0); 
 
console.log(result);

+0

Мне интересно, что я должен изменить, если я хочу добавить 'type' из массива campaings? – DiPix

+0

Последнее, что я забыл. Я предпочитаю этот формат: '[ [ namePartner: "Tesco", nameProduct: "Новый", nameCampaign: "Apple", типа: "appleType" ] ...]' в качестве результата – DiPix

-1

Вы можете использовать get из lodash:

var CAMPAIGN_NAME_PATH = ['partners', 0, 'products', 0, 'campaigns', 0, 'nameCampaig']; 
var campaignName = _.get(JSONObject, CAMPAIGN_NAME_PATH, 'optionalDefaultCampaignName'); 

Или вы могли бы попробовать играть с flatten, flattenDeep и flattenDepth и переставить структура объекта JSON перед (обратите внимание, что эти три метода работают только на массивах, а не на объектах с ключом).