2017-10-03 4 views
0

J'ai un objet d'objets que je veux filtrer via la valeur d'une clé dans les objets. Par exemple, mon objet ressemble à:JS Object Destructuring with Filter

const Financials = { 
    xxxxx: { 
    creditid: "yyyy", 
    aggRevs: 2000, 
    aggexpenses: 1000, 
    dateOf: 12/31/2015 
    }, 
    zzzz: { 
    creditid: "yyyy", 
    aggRevs: 1000, 
    aggexpenses: 1000, 
    dateOf: 12/31/2016 
    }, 
    aaaa: { 
    creditid: "bbbb", 
    aggRevs: 1000, 
    aggexpenses: 1000, 
    dateOf: 12/31/2016 
    } 
}; 

Je souhaite être en mesure de filtrer l'objet par creditid. Par exemple, je veux retourner un objet qui contient tous les objets qui ont un creditid de "yyyy".

var { creditid: "yyyy" } = Financials; 

Et le résultat ressemblerait à ceci:

{ 
    xxxxx: { 
    creditid: "yyyy", 
    aggRevs: 2000, 
    aggexpenses: 1000, 
    dateOf: 12/31/2015 
    }, 
    zzzz: { 
    creditid: "yyyy", 
    aggRevs: 1000, 
    aggexpenses: 1000, 
    dateOf: 12/31/2016 
    } 
} 

Est-ce possible en utilisant déstructurant?

+0

'Est-ce possible en utilisant' destructuration - Je ne pense pas que s o. Voulez-vous copier en profondeur l'objet ou ne pas copier les objets contenus? Je suppose que l'édition de l'original 'Financials' n'est pas destiné comme il est' const'. – ASDFGerte

+0

Je voudrais modifier l'original. J'essaie de mettre à jour/éditer les objets qui ont une paire clé/valeur correspondant pour creditid. Je pensais que la déstructuration pourrait être une façon propre de l'essayer. – Vince

+1

'J'essaie de mettre à jour/éditer les objets qui ont une paire clé/valeur correspondante pour creditid' - est-ce un [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the -xy-problème)? – ASDFGerte

Répondre

0

En ce qui va destructuration, je ne sais pas que cela peut être fait, tout simplement parce que fonctionne plus comme déstructurant .map() que .filter(). Cependant, vous pouvez réellement faire assez facilement avec la fonction .reduce(), comme ceci:

const Financials = { 
 
    xxxxx: { 
 
    creditid: "yyyy", 
 
    aggRevs: 2000, 
 
    aggexpenses: 1000, 
 
    dateOf: 12/31/2015 
 
    }, 
 
    zzzz: { 
 
    creditid: "yyyy", 
 
    aggRevs: 1000, 
 
    aggexpenses: 1000, 
 
    dateOf: 12/31/2016 
 
    }, 
 
    aaaa: { 
 
    creditid: "bbbb", 
 
    aggRevs: 1000, 
 
    aggexpenses: 1000, 
 
    dateOf: 12/31/2016 
 
    } 
 
}; 
 

 
var filtered = Object.keys(Financials).reduce((res, key) => { 
 
    if (Financials[key].creditid === "yyyy") { 
 
    res[key] = Financials[key] 
 
    } 
 
    return res; 
 
}, {}); 
 

 
console.log(filtered);

0

Pour que vous devez itérer chaque propriété de services financiers, comme suit:

const Financials = { 
    xxxxx: { 
    creditid: "yyyy", 
    aggRevs: 2000, 
    aggexpenses: 1000, 
    dateOf: '12/31/2015' 
    }, 
    zzzz: { 
    creditid: "yyyy", 
    aggRevs: 1000, 
    aggexpenses: 1000, 
    dateOf: '12/31/2016' 
    }, 
    aaaa: { 
    creditid: "bbbb", 
    aggRevs: 1000, 
    aggexpenses: 1000, 
    dateOf: '12/31/2016' 
    } 
}; 

var resultFinancials = {}; 

for (var financial in Financials) { 
    if (Financials.hasOwnProperty(financial)) { 
     if(Financials[financial] && Financials[financial].creditid =='yyyy'){ 
      resultFinancials[financial] = Financials[financial]; 
     } 
    } 
} 

console.log(resultFinancials) 
0

Vous pouvez simplement filtrer les entrées d'objets, et la carte puis revenir à nouvel objet

const Financials = { 
 
    xxxxx: { 
 
    creditid: "yyyy", 
 
    aggRevs: 2000, 
 
    aggexpenses: 1000, 
 
    dateOf: 12/31/2015 
 
    }, 
 
    zzzz: { 
 
    creditid: "yyyy", 
 
    aggRevs: 1000, 
 
    aggexpenses: 1000, 
 
    dateOf: 12/31/2016 
 
    }, 
 
    aaaa: { 
 
    creditid: "bbbb", 
 
    aggRevs: 1000, 
 
    aggexpenses: 1000, 
 
    dateOf: 12/31/2016 
 
    } 
 
}; 
 

 
let arr = Object.entries(Financials).filter(set => set[1].creditid === "yyyy"); 
 
let result = Object.assign(...arr.map(d => ({[d[0]]: d[1]}))) 
 

 
console.log(result)
.as-console-wrapper {top:0; max-height: 100%!important}