仅使用已定义的属性创建对象

时间:2017-06-11 04:42:31

标签: javascript ecmascript-6 refactoring

我有一个函数返回一个只定义了属性的对象。

如何重构函数,以便我不需要为每个参数值创建if子句?必须有更优雅的方式来做到这一点。

const getQuery = ({ foo, bar, zoo }) => {
  const query = {};

  if (foo) {
    query.foo = foo;
  }
  if (bar) {
    query.bar = bar;
  }
  if (zoo) {
    query.zoo = zoo;
  }

  return query;
}

2 个答案:

答案 0 :(得分:1)

我会做像

这样的事情
function getQuery(obj){
  // filter the accepted keys
  var filtered = Object.keys(obj).filter((k) => ~["foo", "bar", "baz"].indexOf(k))
  // construct new object with filtered keys
  var query = {}
  filtered.forEach((k) => query[k] = obj[k])
  return query
}

答案 1 :(得分:1)

这是一个基本功能,它只复制wantedProps数组中提供的属性。它不会改变原始对象。

let filterProperties = (originalObject = {}, wantedProps = []) => 
{
    let filteredObject = {};
    wantedProps.forEach( val => filteredObject[val] = originalObject[val] );
    return filteredObject;
} 

如果您只是想过滤掉未定义的val,那么您可以这样做:

obj => {
   let newObject = {}
   Object.keys(obj).forEach(key => {
        if(obj[key] !== undefined) newObject[key] = obj[key];
   })
   return newObject;
}