Получить все ключи глубокого объекта в Javascript
У меня есть следующий объект:
var abc = {
1: "Raggruppamento a 1",
2: "Raggruppamento a 2",
3: "Raggruppamento a 3",
4: "Raggruppamento a 4",
count: '3',
counter: {
count: '3',
},
5: {
test: "Raggruppamento a 1",
tester: {
name: "Ross"
}
}
};
Я хотел бы получить следующий результат:
- abc [1]
- abc [2]
- ABC [3]
- abc [4]
- abc.count
- abc.counter.count
- ABC [5]
- abc [5].test
- abc [5].tester
- ABC [5].tester.name
возможно ли использование nodejs, возможно, с помощью плагинов?
Ответы
Ответ 1
Вы можете сделать это путем рекурсивного перемещения объекта:
function getDeepKeys(obj) {
var keys = [];
for(var key in obj) {
keys.push(key);
if(typeof obj[key] === "object") {
var subkeys = getDeepKeys(obj[key]);
keys = keys.concat(subkeys.map(function(subkey) {
return key + "." + subkey;
}));
}
}
return keys;
}
Запуск getDeepKeys(abc)
объекта в вашем вопросе вернет следующий массив:
["1", "2", "3", "4", "5", "5.test", "5.tester", "5.tester.name", "count", "counter", "counter.count"]
Ответ 2
Меньшая версия, без побочного эффекта, всего одна строка в теле функции:
function objectDeepKeys(obj){
return Object.keys(obj).filter(key => obj[key] instanceof Object).map(key => objectDeepKeys(obj[key]).map(k => `${key}.${k}`)).reduce((x, y) => x.concat(y), Object.keys(obj))
}
var abc = {
1: "Raggruppamento a 1",
2: "Raggruppamento a 2",
3: "Raggruppamento a 3",
4: "Raggruppamento a 4",
count: '3',
counter: {
count: '3',
},
5: {
test: "Raggruppamento a 1",
tester: {
name: "Ross"
}
}
};
function objectDeepKeys(obj){
return Object.keys(obj)
.filter(key => obj[key] instanceof Object)
.map(key => objectDeepKeys(obj[key]).map(k => `${key}.${k}`))
.reduce((x, y) => x.concat(y), Object.keys(obj))
}
console.log(objectDeepKeys(abc))
Ответ 3
Я знаю, что это старый пост...
Этот код охватывает все критерии в формате объекта JSON, такие как просто объект, массив объектов, вложенный массив объектов, вложенный объект с объектами массивов и т.д.
getDeepKeys = function (obj) {
var keys = [];
for(var key in obj) {
if(typeof obj[key] === "object" && !Array.isArray(obj[key])) {
var subkeys = getDeepKeys(obj[key]);
keys = keys.concat(subkeys.map(function(subkey) {
return key + "." + subkey;
}));
} else if(Array.isArray(obj[key])) {
for(var i=0;i<obj[key].length;i++){
var subkeys = getDeepKeys(obj[key][i]);
keys = keys.concat(subkeys.map(function(subkey) {
return key + "[" + i + "]" + "." + subkey;
}));
}
} else {
keys.push(key);
}
}
return keys;
}
Ответ 4
Я использовал этот код (некоторое исправление для предыдущего кода из "Питера Олсона", использовал lodash
), чтобы получить ключи и проверить, является ли какое-то значение значением Date
:
getDeepKeys = function (obj) {
let keys = [];
for (let key in Object.keys(obj)) {
let value = obj[key];
if (_.isDate(value)) {
keys.push(key);
} else if (_.isObject(value)) {
let subkeys = getDeepKeys(value);
keys = keys.concat(subkeys.map(function(subkey) {
return key + "." + subkey;
}));
} else {
keys.push(key)
}
}
return keys;
}
я также проверил, является ли значение mongoDBRef
используемым условием, например: ((_.isObject(value)) && (value && value.oid))