Je souhaite supprimer la bad
propriété de chaque objet du tableau. Y a-t-il une meilleure façon de le faire que d'utiliser une for
boucle et de la supprimer de chaque objet?
var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"},...];
for (var i = 0, len = array.length; i < len; i++) {
delete array[i].bad;
}
Il semble juste qu'il devrait y avoir un moyen d'utiliser prototype
, ou quelque chose. Je ne sais pas. Des idées?
javascript
javascript-objects
Zack Argyle
la source
la source
bad
?Array
prototype, dont dystroy a illustréRéponses:
Les seuls autres moyens sont cosmétiques et sont en fait des boucles.
Par exemple :
array.forEach(function(v){ delete v.bad });
Remarques:
delete
est l'un des pires "tueurs d'optimisation" . Son utilisation casse souvent les performances de vos applications. Vous ne pouvez pas l'éviter si vous souhaitez vraiment supprimer une propriété, mais vous pouvez souvent définir la propriété surundefined
ou simplement créer de nouveaux objets sans la propriété.la source
for(var i = 0; i < array.length ) delete array[i].bad
forEach
parce que je trouve le code plus expressif (et parce que j'ai arrêté de m'inquiéter pour IE il y a longtemps).forEach
est générique et sémantiquement dénué de sens en soi, comme unefor
boucle.Avec ES6, vous pouvez déconstruire chaque objet pour en créer un nouveau sans attribut nommé:
const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
la source
const newArray = array.map(({ bad, ...item }) => item);
// eslint-disable-next-line no-unused-vars
Je préfère utiliser map pour supprimer la propriété, puis renvoyer le nouvel élément de tableau.
array.map(function(item) { delete item.bad; return item; });
la source
return
déclaration explicite ne serait pas requisearray.forEach(v => delete v.bad);
Si vous utilisez underscore.js :
var strippedRows = _.map(rows, function (row) { return _.omit(row, ['bad', 'anotherbad']); });
la source
Une solution utilisant des prototypes n'est possible que lorsque vos objets se ressemblent:
function Cons(g) { this.good = g; } Cons.prototype.bad = "something common"; var array = [new Cons("something 1"), new Cons("something 2"), …];
Mais alors c'est simple (et
O(1)
):delete Cons.prototype.bad;
la source
Pour mon avis, c'est la variante la plus simple
array.map(({good}) => ({good}))
la source
Vous pouvez suivre ceci, plus lisible, pas d'augmentation des attentes en raison d'une clé introuvable:
data.map((datum)=>{ return { 'id':datum.id, 'title':datum.login, }
la source
Je suggérerai d'utiliser
Object.assign
dans uneforEach()
boucle afin que les objets soient copiés et n'affecte pas le tableau d'origine des objetsvar res = []; array.forEach(function(item) { var tempItem = Object.assign({}, item); delete tempItem.bad; res.push(tempItem); }); console.log(res);
la source
Cette question est un peu ancienne maintenant, mais je voudrais proposer une solution alternative qui ne mute pas les données sources et nécessite un effort manuel minimal:
function mapOut(sourceObject, removeKeys = []) { const sourceKeys = Object.keys(sourceObject); const returnKeys = sourceKeys.filter(k => !removeKeys.includes(k)); let returnObject = {}; returnKeys.forEach(k => { returnObject[k] = sourceObject[k]; }); return returnObject; } const array = [ {"bad": "something", "good":"something"}, {"bad":"something", "good":"something"}, ]; const newArray = array.map(obj => mapOut(obj, [ "bad", ]));
C'est encore un peu moins que parfait, mais conserve un certain niveau d'immuabilité et a la possibilité de nommer plusieurs propriétés que vous souhaitez supprimer. (Suggestions bienvenues)
la source
J'ai essayé de créer un nouvel objet sans supprimer les coulmns dans Vue.js.
// selectedContactsDto [] = objet avec la liste des objets de tableau créés dans mon projet
la source
Pour supprimer un tableau d'objet de formulaire de paire clé valeur, utilise Postgres SQL comme base de données comme cet exemple:
Il s'agit d'un objet de détails utilisateur de retour de fonction utilisateur, nous devons supprimer la clé "api_secret" des lignes:
function getCurrentUser(req, res, next) { // user function var userId = res.locals.userId; console.log(userId) db.runSQLWithParams("select * from users where id = $1", [userId], function(err, rows) { if(err){ console.log(err) } var responseObject = { _embedded: rows, } responseObject._embedded[0].api_secret = undefined // console.log(api); // console.log(responseObject); res.json(responseObject); }); }
La fonction ci-dessus renvoie l'objet ci-dessous en tant que réponse JSON avant
{ "_embedded": [ { "id": "0123abd-345gfhgjf-dajd4456kkdj", "secret_key: "secret", "email": "[email protected]", "created": "2020-08-18T00:13:16.077Z" } ] }
Après avoir ajouté cette ligne,
responseObject._embedded[0].api_secret = undefined
il donne le résultat ci-dessous en tant que réponse JSON:{ "_embedded": [ { "id": "0123abd-345gfhgjf-dajd4456kkdj", "email": "[email protected]", "created": "2020-08-18T00:13:16.077Z" } ] }
la source
Le chemin le plus court dans ES6:
array.forEach(e => {delete e.someKey});
la source
var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"}]; var results = array.map(function(item){ return {good : item["good"]} }); console.log(JSON.stringify(results));
la source