使用lodash压平嵌套对象

Gia*_*son 10 javascript ecmascript-6 lodash

flatten,flattenDeep或flattenDepth of lodash只接受数组.如何展平嵌套对象?

var data = {
  "dates": {
    "expiry_date": "30 sep 2018",
    "available": "30 sep 2017",
    "min_contract_period": [{
      "id": 1,
      "name": "1 month",
      "value": false
    }, {
      "id": 2,
      "name": "2 months",
      "value": true
    }, {
      "id": 3,
      "name": "3 months",
      "value": false
    }]
  },
  "price": {
    "curreny": "RM",
    "min": 1500,
    "max": 2000
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望嵌套属性成为第一级,比如expiry_date应该是1级,而不是日期,我认为日期应该消失,不再需要它了.我可以手动完成,使用map(),但我希望使用lodash来简化任务.

RaR*_*RaR 10

最简单的解决方案之一是将嵌套对象与父对象合并,

_.merge(data, data.dates);
Run Code Online (Sandbox Code Playgroud)

这将带来所有data.dates财产data.然后删除data.dates

delete data.dates
Run Code Online (Sandbox Code Playgroud)

  • 我搜索了几个小时来找到一种简单、明智和直观的方法来做到这一点,这是迄今为止最好的答案。 (2认同)

T.C*_*kij 5

ES6版本:

var data = {
  "dates": {
    "expiry_date": "30 sep 2018",
    "available": "30 sep 2017",
    "min_contract_period": [{
      "id": 1,
      "name": "1 month",
      "value": false
    }, {
      "id": 2,
      "name": "2 months",
      "value": true
    }, {
      "id": 3,
      "name": "3 months",
      "value": false
    }]
  },
  "price": {
    "curreny": "RM",
    "min": 1500,
    "max": 2000
  }
};

var {dates: {expiry_date, ...dates}, ...rest} = data;
var flatData = {dates, expiry_date, ...rest}
console.log(flatData)
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是,必须小心深度嵌套的析构.在这个例子中,如果data.dates是undefined,你将尝试解构它,将抛出错误.


Yos*_*ero 3

您可以.merge()结果.get()和_.pick():

var data = {"dates": {"expiry_date": "30 sep 2018","available": "30 sep 2017","min_contract_period": [{"id": 1,"name": "1 month","value": false}, {"id": 2,"name": "2 months","value": true}, {"id": 3,"name": "3 months","value": false}]},"price": {"curreny": "RM","min": 1500,"max": 2000}},
    result = _.merge(_.get(data, 'dates'), _.pick(data, 'price'));

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)