用于调整其他对象的模式的对象模型模式

时间:2018-05-20 00:58:50

标签: javascript arrays ecmascript-6 javascript-objects ecmascript-5

您好,

问题:如何构建以下功能:

  1. 通过参数重现一个对象;
  2. 这是第二个参数的模式模型;
  3. 第二个参数是一个对象数组,它们与第一个参数的模型不同;
  4. 目标:返回需要是具有此修改的对象数组:

    1. 需要删除每个元素中第一个参数(对象模型)上不存在的属性;
    2. 对于元素上不存在的属性,需要使用NULL值创建;
    3. 最后,每个元素的其他属性需要保持相同的值;
    4. 示例 - 调用函数:

          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 :(得分:0)

我认为.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'}])
)




答案 1 :(得分:0)

这接近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)