Заполнить объект JavaScript другим

У меня есть такой объект 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
    }
  }
}

Но это не работает... Что не так?

Вот рабочий пример

похоже на jquery. если да, то где ссылки на CDN библиотеки

cmgchess 22.08.2024 16:00

@cmgchess, ты имеешь в виду скрипку? Это в поле javascript: JavaScript + jQuery Slim 3.2.1 - ОП использует jquery только для $.each, поэтому это не имеет отношения к вопросу.,

fdomn-m 22.08.2024 16:02

кстати, я не знаю, почему вы здесь используете Object.defineProperty, но в любом случае Object.defineProperty(allDetails, nameCont, {value:valCont.details})

cmgchess 22.08.2024 16:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
51
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Параметры
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}

Вы прочитали заголовок и данные ожидаемого результата?

Roko C. Buljan 22.08.2024 16:21

на самом деле читается как текст, ОП сказал: «Передать ВСЕ детали другому», если цель состоит в том, чтобы исключить пустые ключи, то это тоже следует указать. (и ожидаемый результат публикуется как неформатированный код, разницу трудно увидеть)

Alex 22.08.2024 16:27

Прочтите вопрос, в частности: «Я ожидаю, что результат должен быть:»

Roko C. Buljan 22.08.2024 16:32

«Все подробности» — это не то же самое, что «Все details». Есть свойство под названием «подробности», которое OP пытается переместить в другую позицию в иерархии объектов.

fdomn-m 22.08.2024 16:37

PS: синтаксис распространения ... создает поверхностный клон, который потенциально может необратимо видоизменить исходные данные глубоко вложенных объектов.

Roko C. Buljan 22.08.2024 16:37

хм, да, моя вина

Alex 22.08.2024 16:41

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));

Другие вопросы по теме