Как преобразовать объект в связанный массив?

63
4

У меня есть объект javascript, например, как

var obj = {
param1 : {
subParam1: 10,
subParam2: 20
},
param2: 123
}

если нужно преобразовать его в объект с ключами только в корне

obj = {
'param1.subParam1' : 10,
'param1.subParam2' : 20,
'param2' : 123
}

спросил(а) 2014-09-04T16:03:00+04:00 6 лет, 9 месяцев назад
1
Решение
77

Для этого вы можете написать простую рекурсивную функцию:

function flatten(obj) {

var result = {},
temp, key, subkey;

for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (Object.prototype.toString.call(obj[key]) == '[object Object]') {
temp = flatten(obj[key]);
for (subkey in temp) {
result[key + '.' + subkey] = temp[subkey];
}
}
else result[key] = obj[key];
}
}

return result;
}

Похоже, он работает так, как ожидалось:

{param1.subParam1: 10, param1.subParam2: 20, param2: 123}

ответил(а) 2014-09-04T16:15:00+04:00 6 лет, 9 месяцев назад
63

Некоторые могут назвать это плотным, некоторые могут назвать его компактным, некоторые могут назвать неясным, некоторые могут назвать его элегантным.

function flatten_object_into_dot_notation(obj) {

return function _flatten(obj, prefix, result) {

return Object.keys(obj).reduce(function(_, key) {
var val = obj[key];
key = prefix + key;

if (val && typeof val==='object') { _flatten(val, key + '.', result); }
else { result[key] = val; }

return result;
}, result);

}(obj, '', {});

}

ответил(а) 2014-09-04T16:27:00+04:00 6 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема