# Object.{pick,omit}

**URL:** <https://es.discourse.group/t/object-pick-omit/515>\
**Category:** 💡 Ideas\
**Created:** [October 26, 2020, 8:42am UTC](https://es.discourse.group/t/object-pick-omit/515 "2020-10-26T08:42:46Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [October 26, 2020, 8:42am UTC](https://es.discourse.group/t/object-pick-omit/515/1 "2020-10-26T08:42:46Z")

</div>

Like what Lodash has implemented [\_.pick](https://lodash.com/docs/4.17.15#pick), [\_.omit](https://lodash.com/docs/4.17.15#omit):

```javascript
({a : 1, b : 2}).pick(['a']); // => {a : 1}
({a : 1, b : 2}).omit(['b']); // => {b : 1}

({a : 1, b : 2}).pick(['c']); // => {}
({a : 1, b : 2}).omit(['c']); // => {a : 1, b : 2}

```

---

<div class="post-metadata">

**Author:** ![voxpelli](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/voxpelli/32/468_2.png) [@voxpelli](https://es.discourse.group/u/voxpelli)\
**Post date:** [October 26, 2020, 6:43pm UTC](https://es.discourse.group/t/object-pick-omit/515/2 "2020-10-26T18:43:26Z")

</div>

Just a note that an omit I can sort of be done today:

```javascript
const { a, ...foo } = { a: 1, b: 2 }; // => foo becomes {b : 1}

```

The pick one is trickier, agree that it would be very nice to have easy such methods.

---

<div class="post-metadata">

**Author:** ![ljharb](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/ljharb/32/8_2.png) [@ljharb](https://es.discourse.group/u/ljharb)\
**Post date:** [October 26, 2020, 7:44pm UTC](https://es.discourse.group/t/object-pick-omit/515/3 "2020-10-26T19:44:59Z")

</div>

pick would be `Object.fromEntries(keys.map(k => [k, obj[k]]))`, which indeed isn't very ergonomic.

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [October 27, 2020, 1:01am UTC](https://es.discourse.group/t/object-pick-omit/515/4 "2020-10-27T01:01:05Z")

</div>

Another problem is whether should we concern about properties from the prototype chain?

```javascript
const pick = keys => Object.fromEntries(
    keys.map(k => obj.hasOwnProperty(k) && [k, obj[k]]).filter(x => x)
);

const omit = keys => Object.fromEntries(
    keys.map(k => !obj.hasOwnProperty(k) && [k, obj[k]]).filter(x => x)
);

```

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [October 27, 2020, 10:32am UTC](https://es.discourse.group/t/object-pick-omit/515/5 "2020-10-27T10:32:38Z")

</div>

I have created [a draft proposal](https://github.com/aleen42/proposal-object-prototype-pick-or-omit), and feel free to discuss it.

---

<div class="post-metadata">

**Author:** ![bergus](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/bergus/32/152_2.png) [@bergus](https://es.discourse.group/u/bergus)\
**Post date:** [October 28, 2020, 12:54am UTC](https://es.discourse.group/t/object-pick-omit/515/6 "2020-10-28T00:54:53Z")

</div>

> [@aleen42](#):
>
> Another problem is whether should we concern about properties from the prototype chain?

Yes, a bultin function should do that. And concerning prototypes, `Object.prototype.pick` is out of the question, `Object.pick` it would need to be.

Btw, with the [_shorthand improvements_ proposal](https://github.com/rbuckton/proposal-shorthand-improvements) you can write `const o2 = { o1.a }`, which I'd prefer over `o2 = Object.pick(o1, ['a'])` for non-dynamic properties.

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [October 28, 2020, 1:30am UTC](https://es.discourse.group/t/object-pick-omit/515/7 "2020-10-28T01:30:52Z")

</div>

Sometimes, if we want to ensure that an object won't has any other side-effected properties, the pick / omit method should be better.

```javascript
postData({[key1] : o[key1], [key2] : o[key2]});
postData(o.pick([key1, key2]));

```

---

<div class="post-metadata">

**Author:** ![JackWorks](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/jackworks/32/260_2.png) [@JackWorks](https://es.discourse.group/u/JackWorks)\
**Post date:** [November 1, 2020, 2:36pm UTC](https://es.discourse.group/t/object-pick-omit/515/8 "2020-11-01T14:36:53Z")

</div>

Is it triggered the getter or copy the property descriptor?

---

<div class="post-metadata">

**Author:** ![septs](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/septs/32/395_2.png) [@septs](https://es.discourse.group/u/septs)\
**Post date:** [November 1, 2020, 2:37pm UTC](https://es.discourse.group/t/object-pick-omit/515/9 "2020-11-01T14:37:37Z")

</div>

I disagree, Please do not define in `Object.prototype`

```javascript
({ pick: undefined }).pick(['pick'])
({ omit: undefined }).omit(['omit'])

```

---

<div class="post-metadata">

**Author:** ![septs](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/septs/32/395_2.png) [@septs](https://es.discourse.group/u/septs)\
**Post date:** [November 1, 2020, 3:00pm UTC](https://es.discourse.group/t/object-pick-omit/515/10 "2020-11-01T15:00:48Z")

</div>

```javascript
Object.keys({}) // returns ["pick", "omit"]

```

is this expectation?

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [November 2, 2020, 1:21am UTC](https://es.discourse.group/t/object-pick-omit/515/11 "2020-11-02T01:21:09Z")

</div>

You may misunderstand:

```javascript
Object.keys({ pick: undefined, omit: undefined }); // => ["pick", "omit"]
Object.keys(({ pick: undefined, omit: undefined }).pick(['pick'])); // => ["pick"]

```

I think this is normal

---

<div class="post-metadata">

**Author:** ![septs](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/septs/32/395_2.png) [@septs](https://es.discourse.group/u/septs)\
**Post date:** [November 2, 2020, 1:50am UTC](https://es.discourse.group/t/object-pick-omit/515/12 "2020-11-02T01:50:11Z")

</div>

This can't work, break the web.

```javascript
({ pick() { throw new Error("pick") } }).pick(["pick"])

```

---

<div class="post-metadata">

**Author:** ![ljharb](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/ljharb/32/8_2.png) [@ljharb](https://es.discourse.group/u/ljharb)\
**Post date:** [November 2, 2020, 1:55am UTC](https://es.discourse.group/t/object-pick-omit/515/13 "2020-11-02T01:55:38Z")

</div>

In that case, pick must be a method on arrays, otherwise it wouldn’t work (because the keys of that array are 0 and 1).

---

<div class="post-metadata">

**Author:** ![bergus](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/bergus/32/152_2.png) [@bergus](https://es.discourse.group/u/bergus)\
**Post date:** [November 2, 2020, 1:59am UTC](https://es.discourse.group/t/object-pick-omit/515/14 "2020-11-02T01:59:40Z")

</div>

The second line has mismatched parenthesis, did you mean `Object.keys(({…}).pick(…))` or `Object.keys({…}).pick(…)`? But neither of them will work with `Object.prototype.pick`.

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [November 2, 2020, 2:30am UTC](https://es.discourse.group/t/object-pick-omit/515/16 "2020-11-02T02:30:13Z")

</div>

I don't understand why it breaks? For instance:

```javascript
const pick = (obj, keys) => Object.fromEntries(
    keys.map(k => obj.hasOwnProperty(k) && [k, obj[k]]).filter(x => x)
);

pick({
    pick() { throw new Error("pick") },
    omit: undefined,
}, ['pick']); // => {pick: f}

```

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [November 2, 2020, 2:38am UTC](https://es.discourse.group/t/object-pick-omit/515/17 "2020-11-02T02:38:28Z")

</div>

I have testd the implementation of Lodash, and it of course trigger the getter:

```javascript
_.pick(Object.defineProperty({}, 'a', {
    get: () => 'b',
}), ['a']).a; // => "b"

```

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [November 2, 2020, 2:40am UTC](https://es.discourse.group/t/object-pick-omit/515/18 "2020-11-02T02:40:27Z")

</div>

For arrays:

```javascript
[1, 2, 3].pick([0]); // => {0: 1}
[1, 2, 3].pick([0, 1]); // => {0: 1, 1: 2}

```

---

<div class="post-metadata">

**Author:** ![septs](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/septs/32/395_2.png) [@septs](https://es.discourse.group/u/septs)\
**Post date:** [November 2, 2020, 2:44am UTC](https://es.discourse.group/t/object-pick-omit/515/19 "2020-11-02T02:44:18Z")

</div>

I DISAGREE, Re-define any object prototype!

---

<div class="post-metadata">

**Author:** ![aleen42](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/aleen42/32/461_2.png) [@aleen42](https://es.discourse.group/u/aleen42)\
**Post date:** [November 2, 2020, 2:45am UTC](https://es.discourse.group/t/object-pick-omit/515/20 "2020-11-02T02:45:59Z")

</div>

I think such a method will only create a new object with copying some of its prototype without redefine them.

---

<div class="post-metadata">

**Author:** ![septs](https://yyz2.discourse-cdn.com/free1/user_avatar/es.discourse.group/septs/32/395_2.png) [@septs](https://es.discourse.group/u/septs)\
**Post date:** [November 2, 2020, 2:47am UTC](https://es.discourse.group/t/object-pick-omit/515/21 "2020-11-02T02:47:20Z")

</div>

You defined in `Object.prototype.pick`, thanks.

```javascript
const foo = { pick() { throw new Error("pick") } }

foo.pick() // here expect is throw a error, but not is `Object.prototype.pick`.

```

[Next page](https://es.discourse.group/t/object-pick-omit/515.md?page=2)
