Схема объектной модели для настройки схемы других объектов - PullRequest
0 голосов
/ 20 мая 2018

Привет,

Вопрос: Как создать функцию, которая:

  1. Получить объект по аргументу;
  2. Это модель схемы для второго аргумента;
  3. Второй аргумент - это массив объектов, который не совпадает с моделью первого аргумента;

Цель: Возвращать должен быть массив объектов с этими модификациями:

  1. Необходимо удалить каждый из элементов, свойства которых 'существует на первом аргументе (объектная модель);
  2. Для свойств, которые не существуют для элемента, необходимо создать значение NULL;
  3. Наконец, остальные свойства каждого элемента должны сохраняться с тем же значением;

Пример - функция вызова:

    padronizarCom({id: 1, nome:'abcd'}, [{nome:'Carlos', idade:30}, {a:'x', b:'y', c:'z'}])

  // **output:**
  // 0:{nome: "Carlos", id: null}
  // 1:{nome: null, id: null}

const padronizarCom = (object,array) => array.reduce(
    (accum, { id, nome}, i) => (
      {
        ...accum,
        [i]: {id, nome}
      }),
    {} 
   );
   
   
   console.log(padronizarCom({id: 1, nome:'abcd'}, [{nome:'felipe', idade:27}, {a:'x', b:'y', c:'z'}]));

Но это решение слишком специфично для общей проблемы.любая идея?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Это близко к однострочному с map() и reduce().Было бы проще, если бы вы могли вернуть undefined вместо null для несуществующих ключей:

function padronizarCom(schema, obj) {
  return obj.map(item => Object.keys(schema)
            .reduce((a, key) => (a[key] = (item[key] !== undefined ? item[key] : null), a), {}))

}

let ret = padronizarCom({id: 1, nome:'abcd'}, [{nome:'Carlos', idade:30}, {a:'x', b:'y', c:'z'}])
console.log(ret)
0 голосов
/ 20 мая 2018

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

function padronizarCom(schema, array) {
  let keys = Object.keys(schema);
  return array.map(obj => {
    let newObj = {};
    // build new object using keys from schema
    keys.forEach(key => {
      // use existing object's key if it exist; otherwise null
      newObj[key] = obj.hasOwnProperty(key) ? obj[key] : null;
    });
    return newObj;
  });
}

console.log(
  padronizarCom({id: 1, nome:'abcd'}, [{nome:'Carlos', idade:30 }, {a:'x', b:'y', c:'z'}])
)
...