Comment obtenir un sous-ensemble des propriétés d'un objet javascript

425

Disons que j'ai un objet:

elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};

Je veux créer un nouvel objet avec un sous-ensemble de ses propriétés.

 // pseudo code
 subset = elmo.slice('color', 'height')

 //=> { color: 'red', height: 'unknown' }

Comment puis-je y parvenir?

Christian Schlensker
la source
2
La bibliothèque Underscore a beaucoup de fonctions d'assistance comme celle-ci, consultez-la: underscorejs.org/#pick
Stefan
4
Je pensais que cela disait emo.sliceà première vue.
Bill Criswell
1
À bien y penser ... Je ne créerai pas de sous-ensemble ...
Andrew

Réponses:

676

Utilisation de la déstructuration d'objets et de la sténographie des propriétés

const object = { a: 5, b: 6, c: 7  };
const picked = (({ a, c }) => ({ a, c }))(object);

console.log(picked); // { a: 5, c: 7 }


De Philipp Kewisch:

Il s'agit simplement d'une fonction anonyme appelée instantanément. Tout cela se trouve sur la page Affectation des destructions sur MDN. Voici un formulaire développé

let unwrap = ({a, c}) => ({a, c});

let unwrap2 = function({a, c}) { return { a, c }; };

let picked = unwrap({ a: 5, b: 6, c: 7 });

let picked2 = unwrap2({a: 5, b: 6, c: 7})

console.log(picked)
console.log(picked2)

Ivan Nosov
la source
37
Comment avez-vous appris comment procéder? Nulle part dans les documents ou articles que j'ai vus (y compris MDN), il ne montre la syntaxe des flèches utilisée dans la destruction d'objets. C'est très agréable à savoir.
papiro
52
Il s'agit simplement d'une fonction anonyme appelée instantanément. Tout cela se trouve sur la page Affectation des destructions sur MDN. Voici une forme développée: let unwrap = ({a, c}) => ({a, c}); let unwrap2 = function({a, c}) { return { a, c }; }; let picked = unwrap({ a: 5, b: 6, c: 7 });
Philipp Kewisch
8
existe-t-il un moyen de le faire dynamiquement avec l'opérateur de propagation?
Tom Sarduy
4
@TomSarduy vous pouvez utiliser rest si vous souhaitez spécifier les accessoires à supprimer, par exemple const { b, ...picked } = object, créer pickedcomme { a: 5, c: 7 }. Vous avez simplement spécifié de supprimer b. Votre eslint sera probablement agacé par vous pour avoir déclaré un var que vous n'utilisez pas.
Josh de Qaribou
24
Un inconvénient ici est que vous devez taper complètement la série de noms d'attribut deux fois. Cela pourrait être tout à fait un problème dans les cas où de nombreux attributs doivent être sélectionnés.
Gershom
144

Je suggère de jeter un œil à Lodash ; il a beaucoup de grandes fonctions utilitaires.

Par exemple, ce pick()serait exactement ce que vous recherchez:

var subset = _.pick(elmo, ['color', 'height']);

violon

Ygg
la source
2
idem pour underscore.js
Dan
1
Existe-t-il une fonction pour exclure uniquement certains champs au lieu de les sélectionner? j'ai donc environ 50 champs dans mon json et je veux tout sauf seulement 2 champs.
Shrikant Prabhu
7
oui! vous pouvez utiliser _.omit(elmo, ['voice'])pour tout retourner, maisvoice
xavdid
ce que je n'aime pas dans cette approche, c'est que vous mettez les noms de champ entre guillemets afin qu'ils soient sensibles aux fautes de frappe, les refactorings courants comme renommer une propriété dans votre IDE ne la reprendront pas, etc. etc.
Andy
118

Si vous utilisez ES6, il existe un moyen très concis de le faire en utilisant la déstructuration. La déstructuration vous permet d'ajouter facilement des objets à l'aide d'une répartition, mais elle vous permet également de créer des objets de sous-ensemble de la même manière.

const object = {
  a: 'a',
  b: 'b',
  c: 'c',
  d: 'd',
}

// Remove "c" and "d" fields from original object:
const {c, d, ...partialObject} = object;
const subset = {c, d};

console.log(partialObject) // => { a: 'a', b: 'b'}
console.log(subset) // => { c: 'c', d: 'd'};
Lauren
la source
6
cela ne fonctionne que pour supprimer un champ, pas pour sélectionner un sous-ensemble connu? potentiellement un nombre infini de champs inconnus à supprimer, mais c'est peut-être ce que certaines personnes recherchent
Alexander Mills
Certes, mais il peut supprimer plusieurs champs connus qui peuvent ensuite être réaffectés à un nouvel objet, de sorte qu'il semble toujours pertinent pour cette question. Ajouté à la réponse pour illustrer davantage.
Lauren
1
C'est essentiellement la même chose que la réponse de @Ivan Nosov , bien que cela soit expliqué de manière plus compréhensible ici
icc97
81

Bien qu'il soit un peu plus verbeux, vous pouvez accomplir ce que tout le monde recommandait le soulignement / lodash il y a 2 ans, en utilisant Array.prototype.reduce .

var subset = ['color', 'height'].reduce(function(o, k) { o[k] = elmo[k]; return o; }, {});

Cette approche le résout de l'autre côté: plutôt que de prendre un objet et de lui passer des noms de propriété à extraire, de prendre un tableau de noms de propriété et de les réduire en un nouvel objet.

Bien qu'il soit plus détaillé dans le cas le plus simple, un rappel ici est assez pratique, car vous pouvez facilement répondre à certaines exigences courantes, par exemple changer la propriété 'color' en 'color' sur le nouvel objet, aplatir les tableaux, etc. - n'importe lequel des les choses que vous devez faire lorsque vous recevez un objet d'un service / bibliothèque et que vous créez un nouvel objet nécessaire ailleurs. Bien que le soulignement / lodash soient d'excellentes bibliothèques bien implémentées, c'est mon approche préférée pour moins de dépendance vis-à-vis des fournisseurs, et une approche plus simple et plus cohérente lorsque ma logique de construction de sous-ensemble devient plus complexe.

edit: version es7 du même:

const subset = ['color', 'height'].reduce((a, e) => (a[e] = elmo[e], a), {});

edit: Un bel exemple pour le curry, aussi! Avoir une fonction 'pick' renvoie une autre fonction.

const pick = (...props) => o => props.reduce((a, e) => ({ ...a, [e]: o[e] }), {});

Ce qui précède est assez proche de l'autre méthode, sauf qu'il vous permet de créer un «sélecteur» à la volée. par exemple

pick('color', 'height')(elmo);

Ce qui est particulièrement intéressant avec cette approche, c'est que vous pouvez facilement passer les «choix» choisis dans tout ce qui prend une fonction, par exemple Array#map:

[elmo, grover, bigBird].map(pick('color', 'height'));
// [
//   { color: 'red', height: 'short' },
//   { color: 'blue', height: 'medium' },
//   { color: 'yellow', height: 'tall' },
// ]
Josh de Qaribou
la source
3
es6 permet que cela soit encore plus propre via les fonctions fléchées et le retour d'Object.assign (puisque l'attribution à une propriété d'objet renvoie la valeur de la propriété, mais Object.assign renvoie l'objet.)
Josh de Qaribou
Une autre note es6: vous aurez très rarement besoin de faire cela du tout, car vous ne détruisez généralement que l'affectation ou les arguments. par exemple function showToy({ color, height }) {ne mettrait que ce dont vous avez besoin dans la portée. L' reduceapproche est principalement logique lorsque vous simplifiez des objets pour la sérialisation.
Josh de Qaribou le
6
Cette version ES6 est moins performante, car elle fait une copie de toutes les propriétés à chaque itération. Il transforme une opération O (n) en O (n ^ 2). Un équivalent ES6 de votre premier bloc de code seraitconst pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {});
4castle
@ 4castle yep bon appel - pas de sens itérer autant. J'aime la syntaxe des virgules - mieux qu'un tas de retours.
Josh de Qaribou le
1
@ShevchenkoViktor J'avais en fait utilisé cette approche dans ma version originale d'es6, mais je l'ai modifiée après le commentaire de @ 4castle. Je pense que la propagation est plus claire, mais c'est une énorme différence pour les objets plus gros dans le code qui pourraient facilement être sur un goulot d'étranglement (par exemple, retarder le rendu des données renvoyées par fetch), donc je recommanderais d'ajouter un commentaire expliquant l'utilisation de l'opérateur virgule.
Josh de Qaribou
45

Déstructuration ES6

La syntaxe de déstructuration permet de déstructurer et de recombiner un objet, avec des paramètres de fonction ou des variables.

La limitation est qu'une liste de clés est prédéfinie, elles ne peuvent pas être répertoriées comme des chaînes, comme le mentionne la question. La déstructuration devient plus compliquée si une clé n'est pas alphanumérique, par exemple foo_bar.

L'inconvénient est que cela nécessite de dupliquer une liste de clés, ce qui entraîne un code détaillé au cas où une liste est longue. Étant donné que la déstructuration duplique la syntaxe littérale des objets dans ce cas, une liste peut être copiée et collée telle quelle.

L'avantage est que c'est une solution performante qui est naturelle pour ES6.

IIFE

let subset = (({ foo, bar }) => ({ foo, bar }))(obj); // dupe ({ foo, bar })

Variables temporaires

let { foo, bar } = obj;
let subset = { foo, bar }; // dupe { foo, bar }

Une liste de chaînes

La liste arbitraire des clés sélectionnées se compose de chaînes, comme l'exige la question. Cela permet de ne pas les prédéfinir et d'utiliser des variables qui contiennent des noms de clés, comme pick(obj, 'foo', someKey, ...moreKeys).

Une doublure devient plus courte avec chaque édition JS.

ES5

var subset = Object.keys(obj)
.filter(function (key) { 
  return ['foo', 'bar'].indexOf(key) >= 0;
})
.reduce(function (obj2, key) {
  obj2[key] = obj[key];
  return obj2;
}, {});

ES6

let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => Object.assign(obj2, { [key]: obj[key] }), {});

Ou avec un opérateur virgule:

let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => (obj2[key] = obj[key], obj2), {});

ES2019

ECMAScript 2017 a Object.entrieset Array.prototype.includes, ECMAScript 2019 a Object.fromEntries, ils peuvent être polyfilled en cas de besoin et rendre la tâche plus facile:

let subset = Object.fromEntries(
  Object.entries(obj)
  .filter(([key]) => ['foo', 'bar'].includes(key))
)

Un one-liner peut être réécrit comme une fonction d'assistance similaire à Lodashpick ou omitoù la liste des clés est passée par des arguments:

let pick = (obj, ...keys) => Object.fromEntries(
  Object.entries(obj)
  .filter(([key]) => keys.includes(key))
);

let subset = pick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1 }

Une note sur les clés manquantes

La principale différence entre la déstructuration et la fonction conventionnelle de type Lodash pickest que la déstructuration inclut des clés choisies inexistantes avec une undefinedvaleur dans un sous-ensemble:

(({ foo, bar }) => ({ foo, bar }))({ foo: 1 }) // { foo: 1, bar: undefined }

Ce comportement peut être souhaitable ou non. Il ne peut pas être modifié pour la syntaxe de déstructuration.

Alors que pickpeut être modifié pour inclure les clés manquantes en itérant une liste de clés sélectionnées à la place:

let inclusivePick = (obj, ...keys) => Object.fromEntries(
  keys.map(key => [key, obj[key]])
);

let subset = inclusivePick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1, bar: undefined }
Flacon Estus
la source
11
Quel dommage que cette réponse soit si récente et n'obtienne donc pas l'exposition qu'elle mérite. L'OMI devrait être la réponse acceptée pour l'exhaustivité, la simplicité, la polyvalence et la justesse. Je conserverai la version ES6 dans ma bibliothèque d'extraits de code la plus utile.
VanAlbert
ES5 - "Uncaught ReferenceError: obj n'est pas défini"
Nikhil Vartak
@NikhilVartak On s'attend à ce que la objvariable soit une variable qui stocke un objet. Si le nom de votre variable diffère, utilisez-le à la place de obj.
Estus Flask
Ma faute! J'ai oublié Object.keys(obj). Somnolent.
Nikhil Vartak
34

Il n'y a rien de tel que intégré à la bibliothèque principale, mais vous pouvez utiliser la déstructuration d'objets pour le faire ...

const {color, height} = sourceObject;
const newObject = {color, height};

Vous pouvez également écrire une fonction utilitaire le faire ...

const cloneAndPluck = function(sourceObject, keys) {
    const newObject = {};
    keys.forEach((obj, key) => { newObject[key] = sourceObject[key]; });
    return newObject;
};

const subset = cloneAndPluck(elmo, ["color", "height"]);

Des bibliothèques comme Lodash en ont également _.pick().

alex
la source
1
génial, je viens de changer le forEach en: keys.forEach (key => {newObject [key] = sourceObject [key];}) ;. Veuillez mettre à jour le commentaire si cela a du sens.
kandan
34

J'ajoute cette réponse car aucune des réponses n'a été utilisée Comma operator.

C'est très facile avec destructuring assignmentet ,opérateur

const object = { a: 5, b: 6, c: 7  };
const picked = ({a,c} = object, {a,c})

console.log(picked);

Avec une certaine amélioration pour l'attribution des propriétés dynamiques, cela pourrait ressembler à ceci:

Code Maniac
la source
2
mon mauvais, je ne sais pas ce que j'ai fait avant que ça n'a pas fonctionné mais ça semble fonctionner
ekkis
1
C'est la meilleure expression quand il s'agit de déstructurer
Mohamed Allal
1
cette solution est intelligente, mais elle ne fonctionne pas en mode strict (ie 'use strict'). Je reçois un ReferenceError: a is not defined.
kimbaudi
8
Notez que cette approche pollue la portée actuelle avec deux variables aet c- veillez à ne pas écraser au hasard les variables locales ou globales en fonction du contexte. (La réponse acceptée évite ce problème en utilisant deux variables locales dans une fonction en ligne, qui tombe hors de portée après exécution immédiate.)
mindplay.dk
2
La pollution de l'espace de noms rend cela totalement impossible. Il est extrêmement courant d'avoir déjà des variables dans la portée qui correspondent aux propriétés de l'objet, c'est pourquoi le raccourci prop + déstructuration existe.Très probablement, vous aurez une hauteur ou une couleur déjà définie comme dans l'exemple d'origine.
Josh de Qaribou le
23

Encore une solution:

var subset = {
   color: elmo.color,
   height: elmo.height 
}

Cela me semble beaucoup plus lisible que n'importe quelle réponse jusqu'à présent, mais peut-être que c'est juste moi!

Evert
la source
9
Je préfère être productif plutôt que d'être un code sophistiqué mais déroutant, et dans l'ingénierie logicielle de la vie réelle, c'est de loin la solution la plus lisible et maintenable.
Janos
1
Oui, cependant, pour moi, un avantage de l'utilisation de la déstructuration et de la notation abrégée est qu'elle est moins sujette aux erreurs. Si j'avais eu un sou pour chaque fois que j'ai copié et collé du code par erreur subset = {color: elmo.color, height: elmo.color}, j'aurais eu au moins un ... enfin, un centime peut-être.
JHH
Je n'appellerais pas la sténographie destructrice moins sujette aux erreurs car ce n'est pas SEC
gman
Je dois être d'accord. Sans polluer le contexte avec des variables indésirables, c'est de loin la solution la plus lisible. Le reste semble trop déroutant. Je préfère comprendre mon code dès que je le regarde.
Andrew
11

Vous pouvez également utiliser Lodash .

var subset = _.pick(elmo ,'color', 'height');

En complément, disons que vous avez un ensemble de "elmo":

elmos = [{ 
      color: 'red',
      annoying: true,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'blue',
      annoying: true,
      height: 'known',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'yellow',
      annoying: false,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    }
];

Si vous voulez le même comportement, en utilisant lodash, vous devez simplement:

var subsets = _.map(elmos, function(elm) { return _.pick(elm, 'color', 'height'); });
Arthur Alvim
la source
10

La déstructuration en variables nommées dynamiquement est impossible en JavaScript comme discuté dans cette question .

Pour définir des clés de manière dynamique , vous pouvez utiliser la fonction de réduction sans mutation d'objet comme suit:

const getSubset = (obj, ...keys) => keys.reduce((a, c) => ({ ...a, [c]: obj[c] }), {});

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'color', 'annoying')
console.log(subset)

Vous devriez noter que vous créez un nouvel objet à chaque itération au lieu de mettre à jour un seul clone. - mpen

ci-dessous est une version utilisant réduire avec un seul clone (mise à jour de la valeur initiale transmise pour réduire).

const getSubset = (obj, ...keys) => keys.reduce((acc, curr) => {
  acc[curr] = obj[curr]
  return acc
}, {})

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'annoying', 'height', 'meta')
console.log(subset)

Muhammet Enginar
la source
1
Impressionnant! Cela me jeta un instant sans réaliser à quel point les crochets étaient essentiels sur [c]:. Je suppose que cela fait en quelque sorte que c soit considéré comme une valeur au lieu du nom de la propriété. Quoi qu'il en soit, très cool. +1
John Fairbanks
Merci mon pote! Cette utilisation est une chose que j'aime avec JavaScript qui permet des fonctions génériques sans utiliser eval. Simplement, cela vous permet de définir une clé de dict sur une variable au moment de l'exécution. si vous définissez var key = 'someKey', vous pouvez l'utiliser comme {[key]: 'value'}, ce qui vous donne {someKey: 'value'}. Vraiment cool.
Muhammet Enginar
1
Vous devriez noter que vous créez un nouvel objet à chaque itération au lieu de mettre à jour un seul clone.
mpen
1
@mpen bonne trouvaille. J'ai ajouté une version mutant un clone unique, comme vous l'avez suggéré de diffuser également des arguments à la place en passant un tableau de clés.
Muhammet Enginar
7

Solution TypeScript:

export function pick<T extends object, U extends keyof T>(obj: T, paths: Array<U>) {
    return paths.reduce((o, k) => {
        o[k] = obj[k];
        return o;
    }, Object.create(null));
}

Les informations de saisie permettent même la saisie semi-automatique:

Crédit à DefinitelyTyped pour U extends keyof Tastuce!

mpen
la source
Ne travaille pas pour moi.
Nuthinking
@Nuthinking Utilisez-vous VS Code?
mpen
oui, j'utilise VS Code.
Nuthinking
@Nuthinking Et vous avez mis cela dans un fichier .ts? Cela devrait fonctionner. Je viens de l'essayer à nouveau
mpen
5

Utilisez la pickméthode de la bibliothèque lodash si vous l'utilisez déjà.

var obj = { 'a': 1, 'b': '2', 'c': 3 };

_.pick(object, ['a', 'c']);

// => { 'a': 1, 'c': 3 }

https://lodash.com/docs/4.17.10#pick

Kashif Nazar
la source
4

Solution dynamique

['color', 'height'].reduce((a,b) => (a[b]=elmo[b],a), {})

Kamil Kiełczewski
la source
3

Juste une autre façon ...

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

var subset = [elmo].map(x => ({
  color: x.color,
  height: x.height
}))[0]

Vous pouvez utiliser cette fonction avec un tableau d'objets =)

Arthur Araújo
la source
2

Que diriez-vous:

function sliceObj(obj) {
  var o = {}
    , keys = [].slice.call(arguments, 1);
  for (var i=0; i<keys.length; i++) {
    if (keys[i] in obj) o[keys[i]] = obj[keys[i]];
  }
  return o;
}

var subset = sliceObj(elmo, 'color', 'height');
elclanrs
la source
Cela échouerait si la valeur de la propriété était false(ou fausse). jsfiddle.net/nfAs8
Alxandr
C'est pourquoi je l'ai changé en keys[i] in obj.
elclanrs
2

Cela fonctionne pour moi dans la console Chrome. Un problème avec ça?

var { color, height } = elmo
var subelmo = { color, height }
console.log(subelmo) // {color: "red", height: "unknown"}
MSi
la source
4
Cela se lit bien, mais crée deux variables inutiles, la couleur et la hauteur.
user424174
Je ne comprends pas votre commentaire. L'OP
exigeait
@MSi Cela ne crée pas seulement un objet, il crée également deux variables.
Design par Adrian
1

Affectation destructrice avec propriétés dynamiques

Cette solution s'applique non seulement à votre exemple spécifique mais est plus généralement applicable:

const subset2 = (x, y) => ({[x]:a, [y]:b}) => ({[x]:a, [y]:b});

const subset3 = (x, y, z) => ({[x]:a, [y]:b, [z]:c}) => ({[x]:a, [y]:b, [z]:c});

// const subset4...etc.


const o = {a:1, b:2, c:3, d:4, e:5};


const pickBD = subset2("b", "d");
const pickACE = subset3("a", "c", "e");


console.log(
  pickBD(o), // {b:2, d:4}
  pickACE(o) // {a:1, c:3, e:5}
);

Vous pouvez facilement définir subset4etc. pour prendre en compte plus de propriétés.


la source
1

Bon vieux Array.prototype.reduce:

const selectable = {a: null, b: null};
const v = {a: true, b: 'yes', c: 4};

const r = Object.keys(selectable).reduce((a, b) => {
  return (a[b] = v[b]), a;
}, {});

console.log(r);

cette réponse utilise l'opérateur virgule magique, également: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

si vous voulez devenir vraiment chic, c'est plus compact:

const r = Object.keys(selectable).reduce((a, b) => (a[b] = v[b], a), {});

Tout rassembler dans une fonction réutilisable:

const getSelectable = function (selectable, original) {
  return Object.keys(selectable).reduce((a, b) => (a[b] = original[b], a), {})
};

const r = getSelectable(selectable, v);
console.log(r);
Alexander Mills
la source
1
  1. convertir des arguments en tableau

  2. utiliser Array.forEach()pour choisir la propriété

    Object.prototype.pick = function(...args) {
       var obj = {};
       args.forEach(k => obj[k] = this[k])
       return obj
    }
    var a = {0:"a",1:"b",2:"c"}
    var b = a.pick('1','2')  //output will be {1: "b", 2: "c"}
olivia
la source
4
L'extension du prototype des types natifs est considérée comme une mauvaise pratique, même si cela fonctionnerait. Ne faites pas cela si vous écrivez une bibliothèque.
Emile Bergeron
0
function splice()
{
    var ret = new Object();

    for(i = 1; i < arguments.length; i++)
        ret[arguments[i]] = arguments[0][arguments[i]];

    return ret;
}

var answer = splice(elmo, "color", "height");
John
la source
0

Essayer

const elmo={color:"red",annoying:!0,height:"unknown",meta:{one:"1",two:"2"}};

const {color, height} = elmo; newObject = ({color, height});

console.log(newObject); //{ color: 'red', height: 'unknown' }
mohan kumar
la source
0

Ajoutant mes 2 cents à la réponse d' Ivan Nosov :

Dans mon cas, j'avais besoin de plusieurs clés pour être `` tranchées '' hors de l'objet, donc cela devient très très laid et pas une solution très dynamique:

const object = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const picked = (({ a, aa, aaa, ab, c, cc, ccc, cd }) => ({ a, aa, aaa, ab, c, cc, ccc, cd }))(object);

console.log(picked);

Voici donc une solution dynamique utilisant eval:

const slice = (k, o) => eval(`(${k} => ${k})(o)`);


const object    = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const sliceKeys = '({ a, aa, aaa, ab, c, cc, ccc, cd })';

console.log( slice(sliceKeys, object) );
Igor
la source
-2

Remarque: bien que la question d'origine posée était pour javascript, cela peut être fait jQuery par la solution ci-dessous

vous pouvez étendre jquery si vous le souhaitez, voici l'exemple de code pour une tranche:

jQuery.extend({
  sliceMe: function(obj, str) {
      var returnJsonObj = null;
    $.each( obj, function(name, value){
        alert("name: "+name+", value: "+value);
        if(name==str){
            returnJsonObj = JSON.stringify("{"+name+":"+value+"}");
        }

    });
      return returnJsonObj;
  }
});

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};


var temp = $.sliceMe(elmo,"color");
alert(JSON.stringify(temp));

voici le violon pour le même: http://jsfiddle.net/w633z/

ManMohan Vyas
la source
16
Qu'est-ce que jquery?
Christian Schlensker
1
@ChristianSchlensker c'est javascript
Kevin B