如何根据某些条件减少文字对象?

时间:2017-10-07 19:27:02

标签: javascript

我有以下任务,拥有一个具有此结构的对象数组

{
    fullName: 'Some Name',
    datashow: '1',
    classroom: 'C101',
    audio: true,
    cpu: false,
    internet: false,
    pointer: true,
    screen: false,
    description: 'Lorem ipsum dolor sit amet',
    blocks: '1,2'
}

需要将其转化为:

{
    audio: true,
    pointer: true,
    description: 'Lorem ipsum dolor sit amet'
}

遵循以下条件:

  1. 不应出现fullName,datashow,教室和街区的键和值
  2. 其余的键和值只有在值为真时才会出现
  3. 现在我正在使用此解决方案目前正在以这种方式工作,但我想要一个更快,更优雅的解决方案:

    function reduceActivity(activity) {
        const newObject = {};
    
        for (key in activity) {
            if (key !== 'fullName' && key !== 'datashow' && key !== 'blocks' ) {
                if (activity[key]) {
                    newObject[key] = activity[key];
                }
            }
        }
    
        return newObject;
    }
    

    感谢您的任何帮助或建议

3 个答案:

答案 0 :(得分:2)

试试这个解决方案。关于性能没有实际的变化,在这种情况下你不必担心,但是在这个解决方案中,你给出的keys必须被排除在数组中并使用数组来检查密钥。



const obj = {
    fullName: 'Some Name',
    datashow: '1',
    classroom: 'C101',
    audio: true,
    cpu: false,
    internet: false,
    pointer: true,
    screen: false,
    description: 'Lorem ipsum dolor sit amet',
    blocks: '1,2'
};

const excludeKeys = ['fullName', 'datashow', 'blocks', 'classroom'];

const mappedObj = Object.keys(obj).reduce((o, item) => {

  if( !excludeKeys.includes(item) && obj[item]) {
      o[item] = obj[item];
  }
  
  return o;

}, {});

console.log(mappedObj);




使用此代码中的解决方案

for(key in activity)

如果您的对象具有prototype属性,则可能会出现一些逻辑问题。 key in activity也会为您提供可枚举的原型属性。

答案 1 :(得分:1)

如果要忽略某个键,您可以检查一个对象。然后检查它以及检查proerties值并提前返回。

function reduceActivity(activity) {
    var ignoreKeys = { fullName: true, classroom: true, datashow: true, blocks: true },
        newObject = {};

    Object.keys(activity).forEach(function (key) {
        if (ignoreKeys[key] || !activity[key]) {
            return;
        }
        newObject[key] = activity[key];
    });
    return newObject;
}

答案 2 :(得分:0)

太晚了........

var fields =['classroom', 'audio', 'cpu', 'internet','pointer','screen','description']
var arr = [
    {
        fullName: 'Some Name',
        datashow: '1',
        classroom: 'C101',
        audio: true,
        cpu: false,
        internet: false,
        pointer: true,
        screen: false,
        description: 'Lorem ipsum dolor sit amet',
        blocks: '1,2'
    },
    {
        fullName: 'Some Name',
        datashow: '1',
        classroom: 'C101',
        audio: true,
        cpu: false,
        internet: false,
        pointer: true,
        screen: false,
        description: 'Lorem ipsum dolor sit amet',
        blocks: '1,2'
    },
        {
        fullName: 'Some Name',
        datashow: '1',
        classroom: false,
        audio: false,
        cpu: false,
        internet: false,
        pointer: false,
        screen: false,
        description: false,
        blocks: '1,2'
    }
    ]
    
var ret = arr.reduce((acc, obj)=>{

  var o={}
  fields.forEach(f => {
    if (obj[f] === true || obj[f].length > 0 || obj[f] === 0) o[f]=obj[f]
   })

   if(Object.keys(o).length === 0) 
    return acc
   else
    acc.push(o)
   return acc
},[])
console.log(ret)

相关问题