如何解决遍历嵌套对象的属性以使用ES5或lodash在数组中展平
我有一个与keys
属性相关的map
属性。 keys
的长度与每个地图属性的级别有多深对应。在这种情况下,只有2个级别。
如果我在keys
中添加另一个条目,那么每个地图属性都会更深入。
下面是数据
{
keys: [
"vendorApNbr","type"
],map: {
_default: { <-** 1st level
_default: "'100026'",<-** 2nd level
PT_CC: "'120035'",<-** 2nd level
PT_DC: "'120037'"
},A-00: { <- ** 1st level
_default: "'120037'" <- ** 2nd level
},A-01: {
_default: "'120035'"
},A-02: {
_default: "'120035'"
},A-03: {
_default: "'120036'"
},A-04: {
_default: "'100024'"
}
}
}
我想创建一个数组数组,其中数组中的每个项目都是从第1级到第2级的迭代(但是如果需要的话可以降低更多级)
即
[
['_default','_default',"'10026'"],['_default','PT_CC',"'120035'"],'PP_DC',"'120037'"],['A-00',['A-01',...etc
['A-04',"'100024'"]
]
我仅限于ES5或lodash。我正在考虑递归,但不确定如何处理。任何建议都可以帮助您。
修改 还可以将数组形式转换回嵌套对象形式
解决方法
那呢?它不在乎对象有多少嵌套以及级别是多少。此外,每个深度都可能不同。
var obj = {
"_default": {
"_default": "'100026'","PT_CC": "'120035'","PT_DC": "'120037'"
},"A-00": {
"_default": "'120037'"
},"A-01": {
"_default": "'120035'"
},"A-02": {
"_default": "'120035'"
},"A-03": {
"_default": "'120036'"
},"A-04": {
"_default": "'100024'"
}
}
var result = [];
function rec(acc,obj) {
if (typeof obj === "object") {
for (var key in obj) {
rec(acc.concat([key]),obj[key]);
}
return;
}
result.push(acc.concat([obj]));
}
rec([],obj);
console.log(result);
,
您可以使用Depth-Fist Search来做到这一点。
以下代码是从this webpage中提取的示例。此处的区别是将每个键连接在一起,但是您可以使用相同的算法并进行一些修改以获得列表。
var obj = {
baz: {
foo: {
bar: "5"
},hell: {
sin: "0"
}
},a: {
b: "1"
}
};
var hash = {};
var str = '';
var dfs = function(obj,str) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'string')
hash[str + key] = obj[key];
else {
dfs(obj[key],str + key + '.');
}
}
}
};
dfs(obj,str);
console.log(hash);
,
您可以使用以下递归函数将数组中对象的属性展平。
此功能...
- 仅将一个参数作为参数,并且
- 不依赖外部变量
var data = {
keys: [
"vendorApNbr","type"
],map: {
_default: {
_default: "'100026'",PT_CC: "'120035'",PT_DC: "'120037'"
},A00: {
_default: "'120037'"
},A01: {
_default: "'120035'"
},A02: {
_default: "'120035'"
},A03: {
_default: "'120036'"
},A04: {
_default: "'100024'"
}
}
};
function makeItFlat(data) {
var newArray = [];
var properties = Object.getOwnPropertyNames(data);
for (var prop of properties) {
if (typeof data[prop] === 'object') {
var flat = makeItFlat(data[prop]);
for (var f of flat) {
if (!Array.isArray(f)) {
f = [f];
}
newArray.push([prop].concat(f));
}
} else {
newArray.push([prop].concat([data[prop]]));
}
}
return newArray;
}
var flatArray = makeItFlat(data.map);
console.log(flatArray);
要将数组转换回原始对象,可以使用以下代码:
var flatArray = [
["_default","_default","'100026'"],["_default","PT_CC","'120035'"],"PT_DC","'120037'"],["A00",["A01",["A02",["A03","'120036'"],["A04","'100024'"]
];
function convertArrayOfStringsToObject(flatArray) {
var newObject = {};
var key = flatArray[0];
var entry = null;
if (flatArray.length == 2) {
entry = flatArray[1];
} else {
entry = convertArrayOfStringsToObject(flatArray.slice(1));
}
if (key in newObject) {
//key exists already,then merge:
Object.assign(newObject[key],entry);
} else {
newObject[key] = entry;
}
return newObject;
}
function expandArray(flatArray) {
var newObject = {}
for (var line of flatArray) {
var key = line[0];
var entry = convertArrayOfStringsToObject(line.slice(1));
if (key in newObject) {
//key exists already,then merge:
Object.assign(newObject[key],entry);
} else {
newObject[key] = entry;
}
}
return newObject;
}
console.log(expandArray(flatArray));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。