Заполните поля в объекте, из другого объекта

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

2
задан Notflip 11 March 2019 в 14:02
поделиться

8 ответов

Вы можете использовать для ... в цикле :

const template = {
  a: '',
  b: ''
}

const data = {
  a: 'test',
  b: 'test',
  c: 'test'
}

const result = {};

for (let k in template) {
  result[k] = data[k];
}

console.log(result)

0
ответ дан Taki 11 March 2019 в 14:02
поделиться

Примерно так:

 let result = {};
 const template = {
      a: '',
      b: ''
 }
 const data = {
     a: 'test',
     b: 'test',
     c: 'test'
 }

 for (let prop in data) {
    if(prop in template) result[prop] = data[prop];
 }

 console.log(result);

0
ответ дан giorgi moniava 11 March 2019 в 14:02
поделиться

const template = {
  a: '',
  b: ''
}

const data = {
  a: 'test',
  b: 'test',
  c: 'test'
}

function setData(inputTemplate, inputData) {
    outputObject = {}
    for (var key in inputTemplate) {
        if (inputData[key]) {
          outputObject[key] = inputData[key];
        }
    }
    return outputObject
}

console.log(setData(template, data))

0
ответ дан Andrew McDowell 11 March 2019 в 14:02
поделиться

Просто для удовольствия вы можете использовать прокси магию:)

const template = {
  a: '',
  b: ''
}

const data = {
  a: 'test',
  b: 'test',
  c: 'test'
}

const result = { ...new Proxy(data, {
    ownKeys: () => Object.keys(template)
  })
}

console.log(result)

0
ответ дан Yury Tarabanko 11 March 2019 в 14:02
поделиться

Вы можете получить объект template и свойства с теми же ключами из data.

const
    template = { a: '', b: '', x: '' },
    data = { a: 'test', b: 'test', c: 'test' },
    result = Object.assign(
        {},
        template,
        ...Object.keys(template).map(k => k in data && { [k]: data[k] })
    );
    
console.log(result);

0
ответ дан André DS 11 March 2019 в 14:02
поделиться

Вы можете использовать Array.reduce, чтобы посмотреть на ваш объект и изменить только те ключи, которые вам интересны. Этот метод также будет обрабатывать случай, когда ключа, который вы хотите скопировать из data, здесь нет. Также мы создали новый объект, мы не изменяем существующий.


Без мутации (новый объект)

const template = {
  a: '',
  b: '',
};

const data = {
  a: 'test',
  b: 'test',
  c: 'test',
};

const ret = Object.keys(template).reduce((tmp, x) => {
  tmp[x] = data[x] !== void 0 ? data[x] : tmp[x];

  return tmp;
}, {
  ...template,
});

console.log(ret);

<час >

Мутирование объекта (использовать старый объект)

const template = {
  a: '',
  b: '',
};

const data = {
  a: 'test',
  b: 'test',
  c: 'test',
};

Object.keys(template).forEach((x) => {
  template[x] = data[x] !== void 0 ? data[x] : template[x];
});

console.log(template);

0
ответ дан Grégory NEUT 11 March 2019 в 14:02
поделиться

Вы можете просто зациклить ключи вашего шаблона и установить значение с помощью объекта данных с тем же ключом.

const data = {
    a: 'test',
    b: 'test',
    c: 'test'
}

const template = {
    a: '',
    b: ''
}

Object.keys(template).forEach((key) => template[key] = data[key])

console.log(template)

0
ответ дан R3tep 11 March 2019 в 14:02
поделиться

Вы также можете использовать уменьшить

Пример:

const template = {
  a: '',
  b: ''
}

const data = {
  a: 'test',
  b: 'test',
  c: 'test'
}

const res = Object.keys(template).reduce((all, acc) => {
  all[acc] = data[acc]
  return all
}, {})

console.log(res)

0
ответ дан G.aziz 11 March 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: