Динамически добавлять вложенный объект, выделять заданное значение и добавлять дополнительный объект, используя объект с парами ключ-значение

Я новичок в JavaScript и действительно изо всех сил пытаюсь вложить некоторые значения пар ключ-значение в заданный объект, например Basis (см. Ниже), взяв ключ (например, a) и добавив вложенный ключ (например, e), как показано ниже, и выделить связанное значение из базы с добавленным вложенным ключом. Для каждого необходимо добавить новый объект в ту же иерархию, чтобы обернуть его в массив.

Пример

// Basis could look like this
{ a: '1', b: '2', c: '3', d: '4' }

// Map through basis and add new nested keys 
{ a: 'e', b: 'f', c: 'g', d: 'h', e: 'i', f: 'j', g: 'k' }

// Objective    
{ a: [{e: '1', date: Date.now()}], b: [{f: '2', date: Date.now()}], c: [{g: '3', date: Date.now()}], d: [{h: '4', date: Date.now()}] }

Это трудно. Я понятия не имею. Даже следующий источник мне не помог, так как мне приходится перебирать данный объект с парами ключ-значение. Javascript: как динамически создавать вложенные объекты используя имена объектов, заданные массивом


person Paul Manzer    schedule 22.06.2020    source источник


Ответы (4)


Аналогично приведенным выше ответам, но может быть легче читать пользователю, задавшему вопрос.

Предполагая, что вы используете ES6, вы можете перебрать объект, используя функцию Object.keys() и .forEach.

Object.keys() вернет массив ключей для объекта, и вы можете вызвать forEach() для этого массива.

var basis = { a: '1', b: '2', c: '3', d: '4' }

var nestedKeys = { a: 'e', b: 'f', c: 'g', d: 'h', e: 'i', f: 'j', g: 'k' }

Object.keys(basis).forEach(function (basisKey) {
  Object.keys(nestedKeys).forEach(function (matchedKey) {
    if (basisKey == matchedKey) {
      basis[basisKey] = [{
        [nestedKeys[matchedKey]] : basis[basisKey],
        'date' : Date.now(),
      }];
    }
  });
});

console.log(JSON.stringify(basis, null, 4));

person Brent George    schedule 22.06.2020

Перебрать элементы basis. Используйте ключи, чтобы найти соответствующий элемент в nested, и используйте его в качестве ключа в новом создаваемом объекте.

const basis = { a: '1', b: '2', c: '3', d: '4' };
const nested = { a: 'e', b: 'f', c: 'g', d: 'h', e: 'i', f: 'j', g: 'k' };

const result = Object.entries(basis).reduce((obj, [key, value]) => {
  obj[key] = [{
    [nested[key]]: value,
    date: Date.now()
  }];
  return obj;
}, {});

console.log(result);

[nested[key]]: означает использование значения nested[key] в качестве имени свойства в новом объекте.

person Barmar    schedule 22.06.2020
comment
[вложенный [ключ]]: значение ‹--- Замечательно! +1 от меня. - person Arthur Rubens; 23.06.2020

Что-то вроде этого:

// Basis could look like this
const basis = { a: '1', b: '2', c: '3', d: '4' }

// Map through basis and add new nested keys 
const map = { a: 'e', b: 'f', c: 'g', d: 'h', e: 'i', f: 'j', g: 'k' }

const objective = {};
for (let [key, value] of Object.entries(map)) {
  if(basis[key]) {
    let item = { 
      date: Date.now()
    };
    item[value] = basis[key];
    objective[value] = [item];
  }
}
console.log(objective);
// Objective    
//{ a: [{e: '1', date: Date.now()}], b: [{f: '2', date: Date.now()}], c: [{g: '3', date: Date.now()}], d: [{h: '4', date: Date.now()}] }

person Arthur Rubens    schedule 22.06.2020

Вы можете использовать два вложенных метода reduce для создания вложенного значения любого уровня глубины.

const a = { a: '1', b: '2', c: '3', d: '4' }
const b = { a: 'e.c.f', b: 'a', c: 'g', d: 'h', e: 'i', f: 'j', g: 'k' }

const result = Object.entries(a).reduce((r, [k, v]) => {
  if (k in b) {
    const value = [];

    b[k].split('.').reduce((a, e, i, arr) => {
      const value = arr[i + 1] ? [] : v
      const object = { [e]: value }

      if (!arr[i + 1]) {
        object.date = Date.now()
      }

      a.push(object)
      return arr[i + 1] ? value : a
    }, value)

    r[k] = value
  } else {
    r[k] = v
  }

  return r
}, {})

console.log(result)

person Nenad Vracar    schedule 22.06.2020