Я ищу ваш совет, как перестроить объект в javascript/jquery? Я получаю JSON с сервера
Исходный json (массив var):
{
"key1":{
"subkey1":"a",
"subkey2":"b",
},
"key2":{
"subkey1":"a",
"subkey2":"a",
}
}
Ожидаемый объект:
{
"a":{
"subkey1":[
"key1",
"key2",
],
"subkey2":[
"key2"
]
},
"b":{
"subkey2":[
"key1"
]
}
}
Вот где я застрял:
var newarray = {};
for (var key in array) {
var items = [];
for (var item_id in array[key]) {
items.push(item_id);
newarray[array[key][item_id]] = [];
}
console.info(items);
}
console.info(newarray);
Объекты, представленные subkey1, subkey2, недействительны.
Учитывая, что ключи массива являются числовыми, а ключи вашего объекта не являются числовыми, неясно, как вы хотите преобразовать это в настоящую конструкцию многомерного массива.
Вы имеете в виду "subkey1": ["key1", "key2"]?
Добро пожаловать в Stack Overflow! StackOverflow не является бесплатной службой кодирования. Обновите свой вопрос, чтобы показать, что вы уже пробовали в минимальный воспроизводимый пример. Для получения дополнительной информации см. Как спросить и возьмите тур :)
Привет, ребята, да, пожалуйста, примите мои извинения. Так должно быть [ ]
Внизу слева от вопроса есть ссылка edit, которую вы можете использовать для решения проблем.
Возможно, вы больше похожи на «словарь», но думаете в терминах массива. - ВВК
ожидаемый результат недействителен
Вы можете принять один ответ (если он вам поможет), нажав на большую серую кнопку с галочкой слева. При желании вы можете добавить +10 баллов любому автору любого хорошего ответа, щелкнув верхний серый треугольник.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать итеративный и рекурсивный подход и сохранить целевой объект и путь для следующего рекурсивного вызова.
Если объект больше не найден, возьмите значение и все ключи, а также фактический ключ и сгенерируйте новое свойство в новом объекте. Перейдите к любым другим свойствам объекта.
В вопросе не указывается значение инвертированного объекта. Этот подход присваивает undefined всем свойствам листьев.
function setValue(object, keys, value) {
var last = keys.pop(),
target = keys.reduce((o, k) => o[k] = o[k] || {}, object);
target[last] = target[last] || [];
target[last].push(value);
}
function inverse(source, target = {}, path = []) {
Object.entries(source).forEach(([k, v]) => {
if (v && typeof v === 'object') return inverse(v, target, [k, ...path]);
setValue(target, [v, k, ...path.slice(0, -1)], ...path.slice(-1));
});
return target;
}
var object = { key1: { subkey1: 'a', subkey2: 'b'}, key2: { subkey1: 'a', subkey2: 'a' } },
inversed = inverse(object);
console.info(inversed);.as-console-wrapper { max-height: 100% !important; top: 0; }попробовать (где r = {})
Object.entries(d).map(([k,x])=> Object.entries(x).map( ([s,a]) => (
r[a]=r[a]||{}, r[a][s]=(r[a][s]||[]).concat(k)
)))
let d = {
"key1":{
"subkey1":"a",
"subkey2":"b",
},
"key2":{
"subkey1":"a",
"subkey2":"a",
}
}
let r= {}
Object.entries(d).map( ([k,x])=> Object.entries(x).map( ([s,a]) => (
r[a]=r[a]||{}, r[a][s]=(r[a][s]||[]).concat(k)
)))
console.info(r);Я бы выследил и убил разработчика (голыми руками), который оставил это в кодовой базе, которую я поддерживал.
@KamilKiełczewski - по крайней мере, вы можете использовать значащие имена переменных в некотором роде. Или вы пытаетесь закодировать гольф?
k=ключ, s=подключ, a=буквы a,b
Почему бы не использовать key и subkey в первую очередь?
let input = {
"key1": {
"subkey1": 'a',
"subkey2": 'b',
},
"key2": {
"subkey1": 'a',
"subkey2": 'a',
}
};
let expected = {
"a": {
"subkey1": {
key1: true,
key2: true,
},
"subkey2": {
key2: true
}
},
"b": {
"subkey2": {
key1: true
}
}
};
let output = {};
Object.entries(input).forEach(([key, subObj]) => {
Object.entries(subObj).forEach(([subKey, value]) => {
output[value] = output[value] || {};
output[value][subKey] = output[value][subKey] || {};
output[value][subKey][key] = true;
});
});
console.info(expected);
console.info(output);Вы можете попробовать метод в стиле PHP:
var newArray = {};
for (var key in array) {
for (var subKey in array[key]) {
var val = array[key][subKey];
if (!(val in newArray)) {
newArray[val] = {};
}
if (!(subKey in newArray[val])) {
newArray[val][subKey] = [];
}
newArray[val][subKey].push(key);
}
}
console.info(newArray);
У вас нет многомерного массива. У вас есть объект с вложенными подобъектами.
[]обозначает массив.{}обозначает объект.