У меня есть такой объект JavaScript
const allData = {
"aaa": {
"xxx": {},
"details": {
"111": {
"a": 1
}
}
},
"bbb": {
"yyy": {},
"details": {
"222": {
"a": 10
}
}
},
"ccc": {
"zzz": {},
"details": {
"333": {
"a": 100
}
}
},
"ddd": {
"kkk": {},
"details": {
"444": {
"a": 1000
}
}
}
};
и мне нравится передавать все подробности другому, поэтому:
allDetails = {};
$.each(allData, function (nameCont, valCont){
console.dir(valCont.details);
Object.defineProperty(allDetails, nameCont, valCont.details);
});
console.dir(allDetails);
Я ожидаю, что результат должен быть:
{
"aaa": {
"111": {
"a": 1
}
},
"bbb": {
"222": {
"a": 10
}
},
"ccc": {
"333": {
"a": 100
}
},
"ddd": {
"444": {
"a": 1000
}
}
}
Но это не работает... Что не так?
Вот рабочий пример
@cmgchess, ты имеешь в виду скрипку? Это в поле javascript: JavaScript + jQuery Slim 3.2.1
- ОП использует jquery только для $.each
, поэтому это не имеет отношения к вопросу.,
кстати, я не знаю, почему вы здесь используете Object.defineProperty, но в любом случае Object.defineProperty(allDetails, nameCont, {value:valCont.details})
Параметры
obj
: объект, для которого определяется свойство.prop
: строка или символ, определяющий ключ свойства, которое необходимо определить или изменить.descriptor
: дескриптор определяемого или изменяемого свойства.
Ваш призыв к этому:
Object.defineProperty(allDetails, nameCont, valCont.details);
передает значение как descriptor
, а не дескриптор, так и должно быть:
Object.defineProperty(allDetails, nameCont, { value: valCont.details });
Обновленная скрипта: https://jsfiddle.net/th1ves6q/
allData = {
"aaa":{
"xxx":{},
"details":{
"111":{
"a":1
}
}
},
"bbb":{
"yyy":{},
"details":{
"222":{
"a":10
}
}
},
"ccc":{
"zzz":{},
"details":{
"333":{
"a":100
}
}
},
"ddd":{
"kkk":{},
"details":{
"444":{
"a":1000
}
}
}
};
allDetails = {};
$.each(allData, function (nameCont, valCont){
//console.dir(valCont.details);
Object.defineProperty(allDetails, nameCont, { value: valCont.details });
});
console.dir(allDetails);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
View result in browser console
используйте ... синтаксис распространения
const allDetails = {...allData}
Вы прочитали заголовок и данные ожидаемого результата?
на самом деле читается как текст, ОП сказал: «Передать ВСЕ детали другому», если цель состоит в том, чтобы исключить пустые ключи, то это тоже следует указать. (и ожидаемый результат публикуется как неформатированный код, разницу трудно увидеть)
Прочтите вопрос, в частности: «Я ожидаю, что результат должен быть:»
«Все подробности» — это не то же самое, что «Все details
». Есть свойство под названием «подробности», которое OP пытается переместить в другую позицию в иерархии объектов.
PS: синтаксис распространения ...
создает поверхностный клон, который потенциально может необратимо видоизменить исходные данные глубоко вложенных объектов.
хм, да, моя вина
const allData = {
"aaa": {"xxx": {}, "details": { "111": { "a": 1 }}},
"bbb": {"yyy": {}, "details": { "222": { "a": 10 }}},
"ccc": {"zzz": {}, "details": { "333": { "a": 100 }}},
"ddd": {"kkk": {}, "details": { "444": { "a": 1000 }}}
};
const result = Object.entries(structuredClone(allData)).reduce((acc, [k,v]) => {
acc[k] = v.details;
return acc;
}, {});
console.info(result);
// {"aaa":{"111":{"a":1}}, "bbb":{"222":{"a":10}}, "ccc":{"333":{"a":100}}, "ddd":{"444":{"a":1000}}};
Вложенный for of
с использованием Object.entries
в первом цикле получает первый ключ и записывает его значение в результаты, создавая пустой объект, затем во втором цикле получает ключ/значение value.details
и записывает его в результаты.
const allData = {
"aaa": {
"xxx": {},
"details": {
"111": {
"a": 1
}
}
},
"bbb": {
"yyy": {},
"details": {
"222": {
"a": 10
}
}
},
"ccc": {
"zzz": {},
"details": {
"333": {
"a": 100
}
}
},
"ddd": {
"kkk": {},
"details": {
"444": {
"a": 1000
}
}
}
};
const allDetails = (obj) => {
let result = {}
for (let [k, v] of Object.entries(obj)) {
result[k] = {}
for (let [key, val] of Object.entries(v.details)) {
result[k][key] = val
}
}
return result;
};
console.info(allDetails(allData));
похоже на jquery. если да, то где ссылки на CDN библиотеки