2015-08-06 2 views
0

У меня есть следующие данные в формате JSON, содержащих вложенные массивыКак построить новый массив в подчеркиванием/lodash

{ 
    "works": { 
     "work": [ 
      { 
       "id": "001", 
       "filename": "image1.jpg", 
       "urls": { 
        "url": [ 
         { 
          "_type": "small", 
          "__text": "small-image.jpg" 
         }, 
         { 
          "_type": "medium", 
          "__text": "medium-image.jpg" 
         }, 
         { 
          "_type": "large", 
          "__text": "large-image.jpg" 
         } 
        ] 
       }, 
       "details": { 
        "flash": "0", 
        "model": "CAMERA MODEL 1",      
        "make": "CAMERA MAKE 1",     
       } 
      }, 

      { 
       "id": "001", 
       "filename": "image1.jpg", 
       "urls": { 
        "url": [ 
         { 
          "_type": "small", 
          "__text": "small-image.jpg" 
         }, 
         { 
          "_type": "medium", 
          "__text": "medium-image.jpg" 
         }, 
         { 
          "_type": "large", 
          "__text": "large-image.jpg" 
         } 
        ] 
       }, 
       "details": { 
        "flash": "0", 
        "model": "CAMERA MODEL 2",      
        "make": "CAMERA MAKE 2",     
       } 
      }      
     ] 
    } 
} 

Я хочу переписать массив, так это выглядит, как этот

[{ 
    "id": "001", 
    "filename": "image1.jpg", 
    "_type": "small", 
    "url": "small-image.jpg", 
    "model": "CAMERA MODEL 1",      
    "make": "CAMERA MAKE 1" 
}, { 
    "id": "002", 
    "filename": "image2.jpg", 
    "_type": "small", 
    "url": "small-image.jpg", 
    "model": "CAMERA MODEL 2",      
    "make": "CAMERA MAKE 2" 
}] 

Я читал о цепочке в Lodash, но пока не успел реализовать его. Вот что у меня есть до сих пор:

var flattened = _.chain(data).pluck("works") 
     .concat(_.flatten(_(data).pluck("work"))) 
     .reject(_.isUndefined) 
     .value() 

Любая помощь была бы оценена по достоинству!

+0

Оба члена * работу * массив имеет ' "идентификатор": "001"', но выход есть ' "001" и' "002 «', это опечатка? – RobG

ответ

0

Не знаете, насколько вы заботитесь о чистой цепочке, но использование карты lodash может работать, если все, о чем вы заботитесь, преобразует данные из одного формата в другой.

_(source.works.work).map(function(item){ 
    var image = _(item.urls.url).find({'_type': 'small'}); 
    return { 
    id: item.id, 
    filename: item.filename, 
    _type: image ? image._type : null, 
    url: image ? image.__text : null, 
    model: item.details.model, 
    make: item.details.make 
    }; 
}).value(); 

Это приведет:

[ { id: '001', 
    filename: 'image1.jpg', 
    _type: 'small', 
    url: 'small-image.jpg', 
    model: 'CAMERA MODEL 1', 
    make: 'CAMERA MAKE 1' }, 
    { id: '001', 
    filename: 'image1.jpg', 
    _type: 'small', 
    url: 'small-image.jpg', 
    model: 'CAMERA MODEL 2', 
    make: 'CAMERA MAKE 2' } ] 
+0

Почему 'сокращение' вместо' map'? –

+0

Большое спасибо datfinesoul - я попытался реализовать, но я получаю сообщение об ошибке 'Uncaught TypeError: Не могу прочитать свойство 'work' undefined'. Если я console.log (данные), однако, данные загружаются. Еще раз спасибо. – Desmond

+0

Брайан прав, карта будет лучшим ответом, я слишком устал, когда я ответил. Я обновил код выше. Десмонд, вот ссылка JSBin на ответ. http://jsbin.com/qareqatiri/1/embed?js,console – datfinesoul