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

нов съм в 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