代码之家  ›  专栏  ›  技术社区  ›  yiksanchan

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

  •  1
  • yiksanchan  · 技术社区  · 6 年前

    输入:

    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 playground ):

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

    存货名称 存货名称

    2 回复  |  直到 6 年前
        1
  •  2
  •   CertainPerformance    6 年前

    您不需要像Lodash这样的外部库,您可以使用 flatMap 提取 name items 数组,并创建一个新的数组,该数组由项对象及其关联对象组成 inventory_name s:

    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);

    或者,没有 平面图 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);
        2
  •  0
  •   Dacre Denny    6 年前

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