Cara mendapatkan subset dari properti objek javascript

425

Katakanlah saya punya objek:

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

Saya ingin membuat objek baru dengan subset propertinya.

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

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

Bagaimana saya bisa mencapai ini?

Christian Schlensker
sumber
2
Perpustakaan Underscore memiliki banyak fungsi pembantu seperti ini, periksa: underscorejs.org/#pick
Stefan
4
Saya pikir itu mengatakan emo.slicepada pandangan pertama.
Bill Criswell
1
Setelah dipikir-pikir ... Saya tidak akan membuat subset ...
Andrew

Jawaban:

675

Menggunakan Destrukturisasi Objek dan Properti

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

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


Dari Philipp Kewisch:

Ini sebenarnya hanyalah fungsi anonim yang dipanggil secara instan. Semua ini dapat ditemukan di halaman Penugasan Destrukturisasi di MDN. Ini formulir yang diperluas

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
sumber
37
Bagaimana Anda belajar tentang cara melakukan ini? Tidak ada tempat dalam dokumen atau artikel yang pernah saya lihat (termasuk MDN) yang menunjukkan sintaks panah yang digunakan dalam Destrukturisasi Objek. Ini sangat menyenangkan untuk diketahui.
papiro
52
Ini sebenarnya hanyalah fungsi anonim yang dipanggil secara instan. Semua ini dapat ditemukan di halaman Penugasan Destrukturisasi di MDN. Ini formulir yang diperluas: 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
apakah ada cara untuk melakukannya secara dinamis dengan operator spread?
Tom Sarduy
4
@ TomSarduy Anda dapat menggunakan istirahat jika Anda ingin menentukan alat peraga yang akan dihapus, misalnya const { b, ...picked } = objectakan dibuat pickedsebagai { a: 5, c: 7 }. Anda telah menentukan hanya untuk menghapus b. Eslint Anda mungkin akan kesal pada Anda karena menyatakan var yang tidak Anda gunakan.
Josh dari Qaribou
24
Kerugian di sini adalah Anda harus mengetik secara penuh rangkaian nama atribut dua kali. Itu bisa menjadi masalah dalam kasus di mana banyak atribut harus diambil.
Gershom
144

Saya sarankan untuk melihat Lodash ; ia memiliki banyak fungsi utilitas yang luar biasa.

Misalnya pick()persis apa yang Anda cari:

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

biola

Ygg
sumber
2
sama untuk underscore.js
Dan
1
Apakah ada fungsi untuk mengecualikan hanya bidang tertentu daripada memilih? jadi saya punya sekitar 50 bidang di json saya dan ingin semuanya kecuali hanya 2 bidang.
Shrikant Prabhu
7
ya! Anda dapat menggunakan _.omit(elmo, ['voice'])untuk mengembalikan semuanya kecualivoice
xavdid
apa yang saya tidak suka tentang pendekatan ini adalah Anda memasukkan nama bidang dalam tanda kutip sehingga rentan terhadap kesalahan ketik, refactoring umum seperti mengubah nama properti di IDE Anda tidak akan mengambilnya, dll.
Andy
117

Jika Anda menggunakan ES6, ada cara yang sangat ringkas untuk melakukan ini dengan menggunakan penataan. Destrukturisasi memungkinkan Anda untuk dengan mudah menambahkan objek menggunakan spread, tetapi juga memungkinkan Anda untuk membuat objek subset dengan cara yang sama.

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
sumber
6
ini hanya berfungsi untuk menghapus bidang, bukan untuk memilih bagian yang diketahui? berpotensi sejumlah besar bidang tak dikenal untuk dihapus, tetapi mungkin itulah yang dicari sebagian orang
Alexander Mills
Benar, tetapi bisa menghapus beberapa bidang yang diketahui yang kemudian dapat dipindahkan ke objek baru sehingga masih terasa relevan dengan pertanyaan ini. Ditambahkan ke jawaban untuk menggambarkan lebih lanjut.
Lauren
1
Ini pada dasarnya sama dengan apa yang ada dalam jawaban @Ivan Nosov , meskipun dijelaskan dengan cara yang lebih dimengerti di sini
icc97
81

Meskipun sedikit lebih bertele-tele, Anda dapat mencapai apa yang orang lain rekomendasikan underscore / lodash selama 2 tahun yang lalu, dengan menggunakan Array.prototype.reduce .

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

Pendekatan ini menyelesaikannya dari sisi lain: alih-alih mengambil objek dan meneruskan nama properti ke sana untuk mengekstrak, ambil array nama properti dan kurangi menjadi objek baru.

Sementara itu lebih verbose dalam kasus paling sederhana, panggilan balik di sini cukup berguna, karena Anda dapat dengan mudah memenuhi beberapa persyaratan umum, misalnya mengubah properti 'warna' menjadi 'warna' pada objek baru, susun array, dll. - semua hal-hal yang perlu Anda lakukan ketika menerima objek dari satu layanan / perpustakaan dan membangun objek baru yang diperlukan di tempat lain. Walaupun garis bawah / lodash adalah lib yang sangat baik dan diimplementasikan dengan baik, ini adalah pendekatan yang saya pilih untuk mengurangi ketergantungan pada vendor, dan pendekatan yang lebih sederhana, lebih konsisten ketika logika membangun-subset saya menjadi lebih kompleks.

edit: versi es7 yang sama:

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

sunting: Contoh yang bagus untuk kari, juga! Minta fungsi 'pilih' mengembalikan fungsi lainnya.

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

Di atas cukup dekat dengan metode lain, kecuali itu memungkinkan Anda membangun 'pemilih' dengan cepat. misalnya

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

Apa yang sangat rapi tentang pendekatan ini, adalah Anda dapat dengan mudah memasukkan 'picks' yang dipilih ke dalam apa pun yang berfungsi, misalnya Array#map:

[elmo, grover, bigBird].map(pick('color', 'height'));
// [
//   { color: 'red', height: 'short' },
//   { color: 'blue', height: 'medium' },
//   { color: 'yellow', height: 'tall' },
// ]
Josh dari Qaribou
sumber
3
es6 memungkinkan ini menjadi lebih bersih melalui fungsi panah, dan pengembalian Object.assign (karena menetapkan ke properti objek mengembalikan nilai properti, tetapi Object.assign mengembalikan objek.)
Josh dari Qaribou
Catatan es6 lain: Anda akan sangat jarang perlu melakukan ini sama sekali, karena Anda biasanya hanya merusak penugasan atau argumen. misalnya function showToy({ color, height }) {hanya akan menempatkan apa yang Anda butuhkan dalam ruang lingkup. The reducePendekatan terutama masuk akal ketika Anda menyederhanakan objek untuk serialisasi.
Josh dari Qaribou
6
Versi ES6 itu kurang berkinerja, karena itu membuat salinan semua properti dengan setiap iterasi. Itu membuat operasi O (n) menjadi O (n ^ 2). Setara dengan ES6 dari blok kode pertama Anda adalahconst pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {});
4castle
@ 4castle ya panggilan bagus - tidak masuk akal iterating begitu banyak. Saya suka sintaks koma - lebih baik daripada banyak pengembalian.
Josh dari Qaribou
1
@ShevchenkoViktor Saya benar-benar menggunakan pendekatan itu dalam versi es6 asli saya, tetapi mengubahnya setelah komentar @ 4castle. Saya pikir penyebarannya lebih jelas, tetapi ini merupakan perbedaan besar untuk objek yang lebih besar dalam kode yang dapat dengan mudah berada di bottleneck (misalnya, menunda rendering data yang dikembalikan dari fetch), jadi saya akan merekomendasikan menambahkan komentar yang menjelaskan penggunaan operator koma.
Josh dari Qaribou
45

Destrukturisasi ES6

Sintaksis restrukturisasi memungkinkan untuk merusak dan menggabungkan kembali suatu objek, dengan parameter fungsi atau variabel.

Batasannya adalah bahwa daftar kunci sudah ditentukan sebelumnya, mereka tidak dapat didaftar sebagai string, seperti yang disebutkan dalam pertanyaan. Destrukturisasi menjadi lebih rumit jika kuncinya adalah non-alfanumerik, misalnya foo_bar.

The downside adalah bahwa ini mengharuskan untuk menduplikasi daftar kunci, ini menghasilkan kode verbose jika daftar panjang. Karena merusak duplikat sintaksis objek objek dalam kasus ini, daftar dapat disalin dan ditempel sebagaimana adanya.

Keuntungannya adalah bahwa itu adalah solusi yang alami untuk ES6.

IIFE

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

Variabel sementara

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

Daftar string

Daftar sewenang-wenang dari kunci yang dipilih terdiri dari string, sesuai dengan pertanyaan. Ini memungkinkan untuk tidak menentukan sebelumnya dan menggunakan variabel yang berisi nama-nama kunci, seperti pick(obj, 'foo', someKey, ...moreKeys).

Satu kalimat menjadi lebih pendek pada setiap edisi 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] }), {});

Atau dengan operator koma:

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

ES2019

ECMAScript 2017 memiliki Object.entriesdan Array.prototype.includes, ECMAScript 2019 memiliki Object.fromEntries, mereka dapat di-polyfilled ketika dibutuhkan dan membuat tugas lebih mudah:

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

Satu kalimatpick dapat ditulis ulang sebagai fungsi pembantu yang mirip dengan Lodash atau di omitmana daftar kunci dilewatkan melalui argumen:

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 }

Catatan tentang kunci yang hilang

Perbedaan utama antara perusakan dan fungsi konvensional seperti Lodash pickadalah bahwa perusakan mencakup kunci pilihan yang tidak ada dengan undefinednilai dalam subset:

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

Perilaku ini mungkin diinginkan atau tidak. Itu tidak dapat diubah untuk merusak sintaksis.

Sementara pickdapat diubah untuk memasukkan kunci yang hilang dengan mengulangi daftar kunci yang dipilih sebagai gantinya:

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 }
Estus Flask
sumber
11
Sayang sekali bahwa jawaban ini sangat baru dan dengan demikian tidak mendapatkan paparan yang layak. IMO itu harus menjadi jawaban yang diterima untuk kelengkapan, kesederhanaan, keserbagunaan dan, kesederhanaan. Saya akan menyimpan versi ES6 di perpustakaan cuplikan saya yang paling berguna.
VanAlbert
ES5 - "Unreught ReferenceError: obj tidak didefinisikan"
Nikhil Vartak
@NikhilVartak Diharapkan bahwa objvariabel adalah variabel yang menyimpan objek. Jika nama variabel Anda berbeda, gunakan saja obj.
Estus Flask
Salahku! Saya diabaikan Object.keys(obj). Ngantuk.
Nikhil Vartak
34

Tidak ada yang seperti itu built-in ke perpustakaan inti, tetapi Anda dapat menggunakan perusakan objek untuk melakukannya ...

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

Anda juga bisa menulis fungsi utilitas melakukannya ...

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

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

Perpustakaan seperti Lodash juga punya _.pick().

alex
sumber
1
hebat, saya hanya perlu mengubah forEach ke: keys.forEach (key => {newObject [key] = sourceObject [key];}) ;. Harap perbarui komentar jika ini masuk akal.
kandan
34

Saya menambahkan jawaban ini karena tidak ada jawaban yang digunakan Comma operator.

Ini sangat mudah dengan destructuring assignmentdan ,Operator

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

console.log(picked);

Dengan penyempurnaan tertentu untuk penetapan properti dinamis, itu bisa terlihat seperti ini:

Code Maniac
sumber
2
saya buruk, saya tidak tahu apa yang saya lakukan sebelumnya bahwa itu tidak berhasil tetapi tampaknya berhasil
ekkis
1
Itu ungkapan terbaik, ketika sampai pada perusakan
Mohamed Allal
1
solusi ini pintar, tetapi tidak bekerja dalam mode ketat (yaitu, 'use strict'). Saya mendapatkan ReferenceError: a is not defined.
kimbaudi
8
Perhatikan bahwa pendekatan ini mencemari ruang lingkup saat ini dengan dua variabel adan c- berhati-hatilah untuk tidak secara acak menimpa vars lokal atau global tergantung pada konteksnya. (Jawaban yang diterima menghindari masalah ini dengan menggunakan dua variabel lokal dalam fungsi inline, yang jatuh keluar dari ruang lingkup setelah eksekusi segera.)
mindplay.dk
2
Polusi namespace membuat ini sama sekali tidak praktis. Sudah sangat umum untuk sudah memiliki variabel dalam ruang lingkup yang sesuai dengan properti objek, itu sebabnya singkatan + perusakan ada. Sangat mungkin Anda akan memiliki tinggi atau warna yang sudah didefinisikan seperti dalam contoh asli.
Josh dari Qaribou
23

Satu lagi solusi:

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

Ini terlihat jauh lebih mudah dibaca daripada jawaban apa pun sejauh ini, tapi mungkin itu hanya aku!

Evert
sumber
9
Saya lebih suka menjadi produktif daripada kode mewah tapi membingungkan, dan dalam rekayasa perangkat lunak kehidupan nyata ini adalah solusi yang paling mudah dibaca dan dipelihara.
Janos
1
Ya, bagaimanapun, bagi saya, satu sisi negatif dari menggunakan destrukturisasi dan notasi steno adalah bahwa itu kurang rawan kesalahan. Jika saya punya satu sen untuk setiap kali saya keliru menyalin & menempel kode untuk berakhir dengan subset = {color: elmo.color, height: elmo.color}, saya akan memiliki setidaknya ... well, mungkin sepeser pun.
JHH
Saya tidak akan menyebut steno
destrrukturisasi
Saya harus setuju. Tanpa mencemari konteks dengan variabel yang tidak diinginkan, ini adalah solusi yang paling mudah dibaca. Sisanya terlihat terlalu membingungkan. Saya lebih suka memahami kode saya begitu saya melihatnya.
Andrew
11

Anda dapat menggunakan Lodash juga.

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

Melengkapi, katakanlah Anda memiliki array "elmo" s:

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

Jika Anda menginginkan perilaku yang sama, menggunakan lodash, Anda cukup:

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

Destrukturisasi menjadi variabel yang dinamai secara dinamis adalah mustahil di JavaScript seperti yang dibahas dalam pertanyaan ini .

Untuk mengatur kunci secara dinamis , Anda dapat menggunakan fungsi pengurangan tanpa memutasi objek sebagai berikut:

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)

Harus dicatat bahwa Anda membuat objek baru di setiap iterasi alih-alih memperbarui satu klon. - Mpen

di bawah ini adalah versi menggunakan pengurangan dengan klon tunggal (memperbarui nilai awal yang diteruskan untuk mengurangi)

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
sumber
1
Luar biasa! Itu membuat saya sejenak tidak menyadari betapa pentingnya tanda kurung pada [c]:. Saya berasumsi bahwa entah bagaimana menyebabkan c dipandang sebagai nilai alih-alih nama properti. Bagaimanapun, sangat keren. +1
John Fairbanks
Terima kasih sobat! Penggunaan itu adalah satu hal yang saya sukai dari JavaScript yang memungkinkan fungsi umum tanpa menggunakan eval. Sederhananya, itu membuat Anda dapat mengatur kunci dict ke variabel saat runtime. jika Anda mendefinisikan var key = 'someKey', maka Anda dapat menggunakannya sebagai {[key]: 'value'}, yang memberi Anda {someKey: 'value'}. Benar-benar keren.
Muhammet Enginar
1
Harus dicatat bahwa Anda membuat objek baru di setiap iterasi alih-alih memperbarui satu klon.
buka
1
@ tolong temukan yang bagus. Saya telah menambahkan versi bermutasi satu klon karena Anda telah menyarankan juga menyebarkan args alih-alih melewati array kunci.
Muhammet Enginar
7

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

Informasi pengetikan bahkan memungkinkan untuk penyelesaian otomatis:

Penghargaan untuk DefinitelyTyped untuk U extends keyof Ttrik!

Mpen
sumber
Tidak bekerja untukku.
Nuthinking
@Nuthinking Apakah Anda menggunakan VS Code?
buka
ya, saya menggunakan VS Code.
Nuthinking
@Nuthinking Dan Anda memasukkannya ke dalam file .ts? Itu seharusnya bekerja. Saya baru saja mencobanya lagi
mpen
5

Gunakan pickmetode perpustakaan lodash jika Anda sudah menggunakan.

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
sumber
4

Solusi dinamis

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

Kamil Kiełczewski
sumber
3

Dengan cara lain ...

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]

Anda dapat menggunakan fungsi ini dengan array Objects =)

Arthur Araújo
sumber
2

Bagaimana tentang:

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
sumber
Ini akan gagal jika nilai properti itu false(atau palsu). jsfiddle.net/nfAs8
Alxandr
Itu sebabnya saya mengubahnya menjadi keys[i] in obj.
elclanrs
2

Ini berfungsi untuk saya di konsol Chrome. Ada masalah dengan ini?

var { color, height } = elmo
var subelmo = { color, height }
console.log(subelmo) // {color: "red", height: "unknown"}
MSi
sumber
4
Ini terdengar bagus, tetapi menciptakan dua variabel yang tidak perlu, warna dan tinggi.
user424174
Jangan mengerti komentar Anda. Persyaratan OP adalah membuat objek yang memiliki dua elemen tersebut
MSi
@ MSi Ini tidak hanya membuat satu objek, itu juga membuat dua variabel.
Disain oleh Adrian
1

Merusak penugasan dengan properti dinamis

Solusi ini tidak hanya berlaku untuk contoh spesifik Anda tetapi lebih umum berlaku:

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

Anda dapat dengan mudah menentukan subset4dll. Untuk mempertimbangkan lebih banyak properti.


sumber
1

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

jawaban ini menggunakan operator koma ajaib, juga: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

jika Anda ingin benar-benar mewah, ini lebih ringkas:

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

Menyatukan semuanya menjadi fungsi yang dapat digunakan kembali:

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
sumber
1
  1. konversi argumen menjadi array

  2. gunakan Array.forEach()untuk memilih properti

    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
sumber
4
Memperluas prototipe jenis asli dianggap praktik yang buruk, meskipun itu akan berhasil. Jangan lakukan ini jika Anda sedang menulis perpustakaan.
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
sumber
0

Mencoba

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
sumber
0

Menambahkan 2 sen saya ke jawaban Ivan Nosov :

Dalam kasus saya, saya perlu banyak tombol untuk 'diiris' dari objek sehingga menjadi sangat cepat dan bukan solusi yang sangat dinamis:

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

Jadi di sini adalah solusi dinamis menggunakan 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
sumber
-2

Catatan: meskipun pertanyaan awal yang diajukan adalah untuk javascript, ini dapat dilakukan jQuery dengan solusi di bawah ini

Anda dapat memperluas jquery jika Anda inginkan di sini adalah kode sampel untuk satu slice:

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

ini biola untuk hal yang sama: http://jsfiddle.net/w633z/

ManMohan Vyas
sumber
16
Apa itu jquery?
Christian Schlensker
1
@ChristianSchlensker ini adalah javascript
Kevin B