2017-10-07 47 views
0

我有以下的任務,有對象的數組這種結構如何根據特定條件減少文字對象?

{ 
    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. 其餘鍵和v如果它的值是true

現在我使用此解決方案alues必須僅出現目前這種方式工作,但我想更快速,更優雅的解決方案:

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; 
} 

感謝任何幫助或建議

+0

是'包括description'爲什麼不'classroom'? –

回答

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也會給你可以枚舉的原型屬性。

+0

謝謝你的時間@Suren和觀察。簡單和優雅的解決方案 – user615274

+0

@ user615274沒問題 –

1

你可以拿一個對象來檢查一個鍵是否應該被忽略。然後檢查它是否符合價格檢查並提前退貨。

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; 
} 
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)