Как передать значение поля во вложенный JSON с помощью lodash - PullRequest
0 голосов
/ 17 февраля 2019

Для ввода:

var json = 
[  
   {  
      "inventory":{  
         "name":"SF Home",
         "items":{  
            "items":[  
               {  
                  "id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a",
                  "name":"SICP (functional programming)"
               },
               {  
                  "id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9",
                  "name":"Learn Python the hard way!"
               },
            ]
         }
      }
   },
   {  
      "inventory":{  
         "name":"SEA Home",
         "items":{  
            "items":[  
               {  
                  "id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28",
                  "name":"FP in Scala"
               }
            ]
         }
      }
   }
]

Это ожидаемый результат:

var expected = [ 
  { 
    id: 'd98e55d3-8ada-4937-bded-d6f8d948eb4a',
    name: 'SICP (functional programming)',
    inventory_name: "SF Home" 
  },
  { 
    id: 'fc490ac2-449e-4aaf-95c5-a993ec220ec9',
    name: 'Learn Python the hard way!',
    inventory_name: "SF Home" 
  },
  { 
    id: '7126a7c2-3328-4bb4-b425-66adb8ad9b28',
    name: 'FP in Scala',
    inventory_name: "SEA Home"
  }
]

Тем не менее, я могу достичь результата ниже (без inventory_name) только с помощью lodash (см. Repl.it детская площадка ):

const _ = require('lodash');

const actual = _.chain(json).map("inventory.items.items").flatten().value();

Фактический результат:

[ { id: 'd98e55d3-8ada-4937-bded-d6f8d948eb4a',
    name: 'SICP (functional programming)' },
  { id: 'fc490ac2-449e-4aaf-95c5-a993ec220ec9',
    name: 'Learn Python the hard way!' },
  { id: '7126a7c2-3328-4bb4-b425-66adb8ad9b28',
    name: 'FP in Scala' } ]

inventory_name отсутствует в результате.Однако я хочу опустить inventory_name до вложенного JSON.Кто-нибудь может помочь заполнить пробел, используя lodash?Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Этого можно добиться без lodash с помощью метода Array#reduce, как описано ниже:

var json=[{"inventory":{"name":"SF Home","items":{"items":[{"id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a","name":"SICP (functional programming)"},{"id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9","name":"Learn Python the hard way!"}]}}},{"inventory":{"name":"SEA Home","items":{"items":[{"id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28","name":"FP in Scala"}]}}}];

/* Iterate over input json and reduce the nested arrays into a single flat
   array for expected */
var expected = json.reduce((result, item) => {

  /* For inventory item of this iteration, map each item of
  item.inventory.items.items to the data shape for items in the resulting
  expected array. The mapped result is concatenated to the result which 
  will be returned to expected */
  return result.concat(item.inventory.items.items.map(inventory => {

    /* Map the id and name of current inventory, as well as
       item.inventory.name to inventory_name
    for each item of expected array */
    return {
      id: inventory.id,
      name: inventory.name,
      inventory_name: item.inventory.name
    }
  }))

}, []);

console.log(expected);
0 голосов
/ 17 февраля 2019

Для этого вам не требуется внешняя библиотека, такая как Lodash - вы можете использовать flatMap для извлечения каждого name и items массива, а также для создания нового массива, состоящего из объектов элементов с соответствующими им inventory_name с:

var json=[{"inventory":{"name":"SF Home","items":{"items":[{"id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a","name":"SICP (functional programming)"},{"id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9","name":"Learn Python the hard way!"},]}}},{"inventory":{"name":"SEA Home","items":{"items":[{"id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28","name":"FP in Scala"}]}}}]

const output = json.flatMap(({ inventory: { name, items }}) => (
  items.items.map(item => ({ ...item, inventory_name: name }))
));
console.log(output);

Или без flatMap вы можете reduce:

var json=[{"inventory":{"name":"SF Home","items":{"items":[{"id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a","name":"SICP (functional programming)"},{"id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9","name":"Learn Python the hard way!"},]}}},{"inventory":{"name":"SEA Home","items":{"items":[{"id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28","name":"FP in Scala"}]}}}]

const output = json.reduce((a, { inventory: { name, items }}) => a.concat(
  items.items.map(item => ({ ...item, inventory_name: name }))
), []);
console.log(output);
...