Javascript nesnesinin özelliklerinin bir alt kümesini edinme


424

Diyelim ki bir nesnem var:

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

Özelliklerinin bir alt kümesiyle yeni bir nesne yapmak istiyorum.

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

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

Bunu nasıl başarabilirim?


2
Alt çizgi kütüphanesinde bunun gibi birçok yardımcı işlev vardır, göz
Stefan

4
Bunu emo.sliceilk bakışta söylediğini düşündüm .
Bill Criswell

1
İkinci düşüncede ... Bir altküme oluşturmayacağım ...
Andrew

Yanıtlar:


673

Nesne Yıkımını ve Özellik Kısayolunu Kullanma

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

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


Philipp Kewisch'ten:

Bu gerçekten sadece anonim bir fonksiyon olarak anılır. Tüm bunlar MDN'deki Yıkım Ataması sayfasında bulunabilir . İşte genişletilmiş bir form

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)


37
Bunun nasıl yapılacağını nasıl öğrendin? Gördüğüm hiçbir dokümanın veya makalenin (MDN dahil) hiçbir yerinde Nesne Yok etme'de kullanılan ok sözdizimini göstermez. Bunu bilmek çok güzel.
papiro

52
Bu gerçekten sadece anonim bir fonksiyon olarak anılır. Tüm bunlar MDN'deki Yıkım Ataması sayfasında bulunabilir. İşte genişletilmiş bir form: 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
forma operatörü ile dinamik olarak yapmanın bir yolu var mı?
Tom Sarduy

4
Kaldırmak sahne belirtmek isterseniz kalanını kullanabilirsiniz @TomSarduy, örneğin const { b, ...picked } = objectyaratacak pickedşekilde { a: 5, c: 7 }. Yalnızca kaldırmayı belirttiniz b. Eslintiniz, kullanmadığınız bir varyasyon bildirdiğiniz için muhtemelen rahatsız olacaktır.
Qaribou'dan Josh

24
Buradaki bir dezavantaj, öznitelik adları serisini iki kez tam olarak yazmanız gerektiğidir. Birçok özelliğin seçilmesi gereken durumlarda bu oldukça sorun olabilir.
Gershom

144

Lodash'a bir göz atmanızı öneririm ; çok sayıda faydalı fonksiyona sahiptir.

Örneğin pick()tam olarak aradığın şey olurdu:

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

Vaktini boşa harcamak


2
underscore.js için aynı
Dan

1
Seçmek yerine yalnızca belirli alanları hariç tutmak için herhangi bir işlev var mı? böylece benim json yaklaşık 50 alan var ve sadece 2 alan hariç her şeyi istiyorum.
Shrikant Prabhu

7
Evet! _.omit(elmo, ['voice'])her şeyi geri dönmek için kullanabilirsiniz amavoice
xavdid

Bu yaklaşımla ilgili sevmediğim şey, alan adlarını tırnak işaretleri içine almaktır, böylece yazım hatalarına açıktır, IDE'nizdeki bir mülkü yeniden adlandırmak gibi yaygın yeniden düzenleme işlemleri, vb.
Andy

117

ES6 kullanıyorsanız, bunu yıkım kullanarak yapmanın çok özlü bir yolu var. Yıkım, bir forma kullanarak nesnelere kolayca eklemenizi sağlar, ancak aynı zamanda alt küme nesnelerini de yapmanızı sağlar.

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

6
Bu yalnızca bilinen bir alt kümeyi seçmek için değil, bir alanı kaldırmak için mi çalışır? kaldırılması gereken sınırsız sayıda bilinmeyen alan olabilir, ancak bazı insanlar bunun için arıyor olabilir
Alexander Mills

Doğru, ancak daha sonra yeni bir nesneye yeniden atanabilen birkaç bilinen alanı kaldırabilir, böylece yine de bu soru ile alakalı hissedilir. Daha fazla açıklamak için cevaba eklendi.
Lauren

1
Bu aslında @Ivan Nosov'un cevabı ile aynıdır , ancak burada daha anlaşılır bir şekilde açıklanmıştır
icc97

81

Biraz daha ayrıntılı olsa da, Array.prototype.reduce komutunu kullanarak herkesin 2 yıl önce alt çizgi / lodash'ı önerdiğini başarabilirsiniz .

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

Bu yaklaşım onu ​​diğer taraftan çözer: bir nesneyi alıp ayıklamak için özellik adlarını iletmek, bir dizi özellik adı almak ve bunları yeni bir nesneye azaltmak yerine.

En basit durumda daha ayrıntılı olsa da, burada bir geri çağrı oldukça kullanışlı, çünkü bazı ortak gereksinimleri kolayca karşılayabilirsiniz, örneğin 'renk' özelliğini yeni nesnede 'renk' olarak değiştirmek, dizileri düzleştirmek vb. bir hizmetten / kitaplıktan bir nesne alırken ve başka bir yere ihtiyaç duyulan yeni bir nesne oluştururken yapmanız gerekenler. Alt çizgi / lodash mükemmel, iyi uygulanmış kütüphaneler olsa da, daha az satıcıya güvenmek için tercih edilen yaklaşımım ve alt küme oluşturma mantığım daha karmaşık hale geldiğinde daha basit, daha tutarlı bir yaklaşım.

edit: aynı es7 sürümü:

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

edit: currying için de güzel bir örnek! 'Seç' işlevinin başka bir işlev döndürmesini sağlayın.

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

Yukarıdakiler diğer yönteme oldukça yakındır, ancak anında bir 'seçici' oluşturmanıza izin verir. Örneğin

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

Bu yaklaşım hakkında özellikle temiz olan şey, seçilen 'seçimleri' kolayca bir işlev alan herhangi bir şeye aktarabilmenizdir, örneğin Array#map:

[elmo, grover, bigBird].map(pick('color', 'height'));
// [
//   { color: 'red', height: 'short' },
//   { color: 'blue', height: 'medium' },
//   { color: 'yellow', height: 'tall' },
// ]

3
es6 bunun ok işlevleri ile daha da temiz olmasını mümkün kılar ve Object.assign'ın dönüşü (bir object özelliğine
atandığınızda

Başka bir es6 notu: Bunu genellikle nadiren yapmanız gerekecek, çünkü genellikle sadece atamayı veya argümanları yıkıyorsunuz. örneğin function showToy({ color, height }) {, sadece ihtiyacınız olanı kapsama alır. reduceEğer seri hale nesneleri basitleştiriyoruz zaman yaklaşım esas mantıklı.
Josh from Qaribou

6
Bu ES6 sürümü daha az performanslıdır, çünkü her yinelemeyle tüm özelliklerin bir kopyasını oluşturur. O (n ^ 2) içine O (n) işlemi yapar. İlk kod bloğunuzun ES6 eşdeğericonst pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {});
4castle

@ 4castle yep iyi çağrı - çok fazla yineleme anlamsız. Virgül sözdizimini seviyorum - geri dönüşlerden daha iyi.
Qaribou'dan Josh

1
@ShevchenkoViktor Aslında bu yaklaşımı orijinal es6 sürümümde kullandım, ancak @ 4castle'ın yorumundan sonra değiştirdim. Ben yayılma daha net olduğunu düşünüyorum, ama kodda kolayca bir darboğaz üzerinde olabilir büyük nesneler için büyük bir fark (örn. Döndürülen işleme verileri gecikme fetch), bu yüzden virgül operatörü kullanımını açıklayan bir yorum eklemenizi tavsiye ederim.
Qaribou konumundan Josh

45

ES6 yıkımı

Yıkım sözdizimi , bir nesneyi işlev parametreleri veya değişkenlerle yıkmaya ve yeniden birleştirmeye izin verir.

Sınırlama, anahtar listesinin önceden tanımlanmış olması, sorudan bahsedildiği gibi dize olarak listelenememesidir. Bir anahtarın alfasayısal olmadığı durumlarda yıkım daha karmaşık hale gelir, ör foo_bar.

Dezavantajı, bunun bir anahtar listesinin çoğaltılmasını gerektirmesidir, bir listenin uzun olması durumunda ayrıntılı kodla sonuçlanır. Bu durumda yıkım, nesne değişmez sözdizimini çoğalttığından, bir liste olduğu gibi kopyalanabilir ve yapıştırılabilir.

Bunun tersi, ES6 için doğal olan performanslı bir çözümdür.

Hayatta

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

Geçici değişkenler

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

Dizelerin bir listesi

Seçilmiş anahtarların keyfi listesi, sorunun gerektirdiği gibi dizelerden oluşur. Bu, onları önceden tanımlamamıza ve anahtar adları içeren değişkenler kullanmanıza izin verir pick(obj, 'foo', someKey, ...moreKeys).

Her JS sürümünde bir astar daha kısalır.

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] }), {});

Veya virgül operatörü ile:

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

ES2019

ECMAScript 2017 , ECMAScript 2019'a sahiptir Object.entriesve gerektiğinde çoklu doldurulabilir ve görevi kolaylaştırır:Array.prototype.includesObject.fromEntries

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

Tek satırlıkpick , Lodash'a benzer bir yardımcı işlev olarak veya omitanahtar listesinin bağımsız değişkenlerden geçirildiği şekilde yeniden yazılabilir :

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 }

Eksik tuşlar hakkında bir not

Yıkım ve geleneksel Lodash benzeri pickişlev arasındaki en büyük fark, yıkımın undefinedbir alt kümede değeri olan var olmayan seçilmiş anahtarlar içermesidir :

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

Bu davranış istenebilir veya istenmeyebilir. Yıkım sözdizimi için değiştirilemez.

İken pickyerine aldı tuşlarının bir listesini yineleme tarafından anahtarları eksik içerecek şekilde değiştirilebilir:

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 }

11
Bu cevabın bu kadar yeni olması ve bu nedenle hak ettiği pozu almaması ne yazık. IMO bütünlük, basitlik, çok yönlülük ve adil işçilik için kabul edilen cevap olmalıdır. ES6 sürümünü en yararlı snippet kütüphanemde tutacağım.
VanAlbert

ES5 - "Yakalanmayan ReferenceError: obj tanımlanmadı"
Nikhil Vartak

@NikhilVartak objDeğişkenin bir nesneyi depolayan bir değişken olması beklenir . Değişken adınız farklıysa, yerine kullanın obj.
Estus Flask

Benim hatam! Göz ardı ettim Object.keys(obj). Uykulu.
Nikhil Vartak

34

Çekirdek kütüphanede yerleşik böyle bir şey yoktur, ancak bunu yapmak için nesne yıkımını kullanabilirsiniz ...

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

Ayrıca bir yardımcı program işlevi yazabilirsiniz ...

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

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

Lodash gibi kütüphaneler de var _.pick().


1
harika, ben sadece forEach değiştirmek zorunda kaldı: keys.forEach (key => {newObject [key] = sourceObject [key];}) ;. Bu mantıklı geliyorsa lütfen yorumu güncelleyin.
kandan

34

Bu cevabı ekliyorum çünkü cevapların hiçbiri kullanılmadı Comma operator.

Bu çok kolay destructuring assignmentve ,operatör

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

console.log(picked);

Dinamik özellikler ataması için belirli bir geliştirmeyle şu şekilde görünebilir:


2
benim kötü, daha önce ne yaptığını bilmiyorum bu işe yaramadı ama işe yarıyor gibi görünüyor
ekkis

1
Bu yıkım söz konusu olduğunda en iyi ifade
Mohamed Allal

1
bu çözüm zekidir, ancak katı modda çalışmaz (yani 'use strict'). Anladım ReferenceError: a is not defined.
kimbaudi

8
Bu yaklaşımın mevcut kapsamı iki değişkenle kirlettiğini ave c- bağlama bağlı olarak yerel veya global değişkenlerin üzerine rastgele yazmamaya dikkat edin. (Kabul edilen yanıt, bir satır içi işlevde, hemen yürütüldükten sonra kapsam dışı kalan iki yerel değişken kullanarak bu sorunu önler.)
mindplay.dk

2
İsim-alanı kirliliği bunu tamamen pratik hale getirmektedir. Kapsam özelliklerinde nesne özelliklerine uyan değişkenlere sahip olmak son derece yaygındır, bu yüzden prop steno + yıkım vardır.Çok muhtemelen orijinal örnekte olduğu gibi tanımlanmış yükseklik veya renge sahip olursunuz.
Qaribou konumundan Josh

23

Bir çözüm daha:

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

Bu benim için şimdiye kadarki herhangi bir cevaptan çok daha okunabilir görünüyor, ama belki bu sadece benim!


9
Süslü ama kafa karıştırıcı kodlara göre üretken olmayı tercih ediyorum ve gerçek yazılım yazılım mühendisliğinde bu çok okunabilir ve bakımı en kolay çözüm.
Janos

1
Evet, bana göre, yıkıcı ve steno gösterimi kullanmanın bir tarafı, daha az hataya eğilimli olmasıdır. Her seferinde bir peni olsaydım, yanlış bir şekilde kopyalayıp kodu yapıştırdım subset = {color: elmo.color, height: elmo.color}, en azından bir ... belki bir kuruş olurdu.
JHH

DRY olmadığı için yıkıcı stenografi daha az hata eğilimli olarak adlandırmazdım
gman

Kabul etmeliydim. Bağlamı istenmeyen değişkenlerle kirletmeden, bu en okunabilir çözümdür. Gerisi çok kafa karıştırıcı görünüyor. Koduna baktığımda ikinci anlamayı tercih ediyorum.
Andrew

11

Lodash'ı da kullanabilirsiniz .

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

Tamamlayıcı, diyelim bir dizi "elmo" lar var:

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

Lodash kullanarak aynı davranışı istiyorsanız, sadece:

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

10

Bu soruda tartışıldığı gibi JavaScript'te dinamik olarak adlandırılmış değişkenlere zarar vermek imkansızdır .

Anahtarları dinamik olarak ayarlamak için , nesneyi aşağıdaki gibi mutasyona uğratmadan azaltma işlevini kullanabilirsiniz:

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)

Tek bir klonu güncellemek yerine her yinelemede yeni bir nesne oluşturduğunuzu unutmayın. - mpen

aşağıda tek klonlu azaltma kullanan bir sürümdür (azaltmak için ilk değeri güncelleme).

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)


1
Müthiş! Köşeli parantezlerin ne kadar önemli olduğunu fark etmemek beni bir an attı. Ben bir şekilde c özellik adı yerine bir değer olarak bakılması neden olduğunu varsayıyorum. Her neyse, çok havalı. +1
John Fairbanks

Teşekkürler dostum! Bu kullanımı, eval kullanmadan genel işlevler sağlayan JavaScript hakkında sevdiğim bir şey. Basitçe, yaptığı şey çalışma zamanında bir değişken için bir dikte anahtarı belirlemenize izin vermektir. var key = 'someKey' tanımlarsanız, bunu {[key]: 'value'} olarak kullanabilirsiniz, bu da size {someKey: 'value'} verir. Gerçekten havalı.
Muhammet Enginar

1
Tek bir klonu güncellemek yerine her yinelemede yeni bir nesne oluşturduğunuzu unutmayın.
19:25

1
@mpen iyi bul. Tek bir klonu mutasyona uğratan bir sürüm ekledim, çünkü bir anahtar dizisini geçirmek yerine argümanlar yaymayı önerdiniz.
Muhammet Enginar

7

TypeScript çözümü:

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

Yazma bilgileri otomatik tamamlamaya bile izin verir:

İçin kredi DefinitelyTyped için U extends keyof Thile!


Benim için çalışmıyor.
Nuthinking

@Nuthinking VS Kodu mu kullanıyorsunuz?
mpen

evet, VS Kodu kullanıyorum.
Nuthinking

@Nuthinking Bunu bir .ts dosyasına mı koydunuz? Bu işe yaramalı. Sadece tekrar denedi
mpen


4

Dinamik çözüm

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


3

Başka bir yol ...

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]

Bu işlevi bir dizi Nesne ile kullanabilirsiniz =)


2

Nasıl olur:

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

Özelliğin değeri false(veya yanlış) olsaydı bu başarısız olur . jsfiddle.net/nfAs8
Alxandr

Bu yüzden değiştirdim keys[i] in obj.
elclanrs

2

Bu, Chrome konsolunda benim için çalışıyor. Bununla ilgili bir sorun mu var?

var { color, height } = elmo
var subelmo = { color, height }
console.log(subelmo) // {color: "red", height: "unknown"}

4
Bu iyi okunur, ancak iki gereksiz değişken oluşturur, renk ve yükseklik.
user424174

Yorumunuzu anlama. OP'nin şartı bu iki unsura sahip bir nesne yaratmaktı
MSi

@MSi Bu yalnızca bir nesne oluşturmakla kalmaz, aynı zamanda iki değişken de oluşturur.
Tasarım Adrian

1

Dinamik özelliklere sahip yıkım ataması

Bu çözüm yalnızca özel örneğiniz için değil, daha genel olarak uygulanabilir:

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

Daha subset4fazla mülkü hesaba katmak için kolayca vb. Tanımlayabilirsiniz .


1

Yaşlı 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);

bu cevap büyülü virgül operatörünü de kullanıyor: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

gerçekten süslü olmak istiyorsanız, bu daha kompakt:

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

Hepsini yeniden kullanılabilir bir işleve koymak:

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

1
  1. bağımsız değişkenleri diziye dönüştür

  2. Array.forEach()özelliği seçmek için kullan

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

4
Yerel türlerin prototipini genişletmek, işe yarayacak olsa da, kötü uygulama olarak kabul edilir. Bir kütüphane yazıyorsanız bunu yapmayın.
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");

0

Deneyin

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

0

2 sentimi Ivan Nosov cevabına ekleyerek :

Benim durumumda nesneden 'dilimlenmek' için birçok anahtara ihtiyacım vardı, bu yüzden çirkin çok hızlı hale geliyor ve çok dinamik bir çözüm değil:

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

İşte eval kullanarak dinamik bir çözüm:

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

-2

Not: Sorulan orijinal soru javascript için olsa da, aşağıdaki çözüm ile jQuery yapılabilir

burada bir dilim için örnek kod istiyorsanız jquery genişletebilirsiniz:

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

İşte aynı keman: http://jsfiddle.net/w633z/


16
JQuery nedir?
Christian Schlensker

1
@ChristianSchlensker javascript
Kevin B
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.