Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用lodash展平嵌套对象_Javascript_Ecmascript 6_Lodash - Fatal编程技术网

Javascript 使用lodash展平嵌套对象

Javascript 使用lodash展平嵌套对象,javascript,ecmascript-6,lodash,Javascript,Ecmascript 6,Lodash,展平、展平深度或仅接受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, "na

展平、展平深度或仅接受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
  }
}
我希望嵌套属性是第一级,比如到期日应该是第1级,而不是在日期内,我认为日期应该消失,不再需要了。我可以手动完成,使用map()但我希望使用lodash来简化任务。

您可以使用和的结果:

var数据={“日期”:{“到期日”:“2018年9月30日”,“可用”:“2017年9月30日”,“最低合同期限”:[{“id”:1,“名称”:“1个月”,“价值”:假},{“id”:2,“名称”:“2个月”,“价值”:真},{“id”:3,“名称”:“3个月”,“价值”:假},},“价格”:{“curreny”:“RM”,“最低”:1500,“最高”:2000},
结果=u.merge(u.get(数据,'dates'),u.pick(数据,'price'));
控制台日志(结果)
。作为控制台包装{最大高度:100%!重要;顶部:0;}

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

_.merge(data, data.dates);
这将把所有
数据.日期
属性带入
数据
。然后删除数据。日期

delete data.dates
ES6版本:

var数据={
“日期”:{
“到期日”:“2018年9月30日”,
“可用”:“2017年9月30日”,
“最短合同期限”:[{
“id”:1,
“姓名”:“1个月”,
“值”:false
}, {
“id”:2,
“姓名”:“2个月”,
“价值”:真实
}, {
“id”:3,
“姓名”:“3个月”,
“值”:false
}]
},
“价格”:{
“curreny”:“RM”,
“分钟”:1500,
“最高”:2000年
}
};
var{dates:{expiration_date,…dates},…rest}=数据;
var flatData={dates,expiration_date,…rest}

console.log(flatData)
这将使用嵌套对象和任意深度的数组展平对象。结果对象中的键是输入对象中属性的完整路径

public static flattenObject(o: any, prefix?: string, result?: any): any {

    prefix = prefix ? prefix : '';
    result = result ? result : {};

    if (_.isString(o) || _.isNumber(o) || _.isBoolean(o)) {
        result[prefix] = o;
        return result;
    }

    if (_.isArray(o) || _.isPlainObject(o)) {
        for (let i in o) {

            let pref = prefix;
            if (_.isArray(o)) {
                pref = pref + `[${i}]`;
            } else {
                if (_.isEmpty(prefix)) {
                    pref = i;
                } else {
                    pref = prefix + '.' + i;
                }
            }

            Utils.flattenObject(o[i], pref, result);
        }
        return result;
    }


    return result;
}


如果您需要展平整个对象,而不仅仅是它的“日期”属性,类似的东西应该可以工作,您甚至不需要lodash:

函数对象(obj){
const result={};
Object.values(obj.forEach)(nestedObject=>{
赋值(结果,嵌套对象);
});
返回结果;
}

您能否给出一个示例代码,说明您希望在任务完成后输出的效果?说第1级和事情“应该消失”可能会混淆一个例子非常清晰的问题。我搜索了几个小时,找到了一个简单、合理和直观的方法来实现这一点,这是迄今为止最好的答案。
function flattenObject(o, prefix = '', result = {}, keepNull = true) {
  if (_.isString(o) || _.isNumber(o) || _.isBoolean(o) || (keepNull && _.isNull(o))) {
    result[prefix] = o;
    return result;
  }

  if (_.isArray(o) || _.isPlainObject(o)) {
    for (let i in o) {
      let pref = prefix;
      if (_.isArray(o)) {
        pref = pref + `[${i}]`;
      } else {
        if (_.isEmpty(prefix)) {
          pref = i;
        } else {
          pref = prefix + '.' + i;
        }
      }
      flattenObject(o[i], pref, result, keepNull);
    }
    return result;
  }
  return result;
}