Javascript 使用lodash展平嵌套对象
展平、展平深度或仅接受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
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;
}