如何使用lodash将字段值下沉到嵌套JSON

时间:2019-02-16 22:27:48

标签: javascript lodash

输入:

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"
  }
]

但是,我只能使用lodash(请参阅Repl.it playground)来获得以下结果(没有inventory_name):

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 :(得分:2)

为此,您不需要像Lodash这样的外部库-您可以使用flatMap提取每个nameitems数组,并创建一个由项对象及其关联的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);

答案 1 :(得分:0)

您可以通过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);