

以下のような配列があったとして,

[code]

    const items = [
      { 'id': 1, 'category': -1, 'question': -1, 'answer': -1 },
      { 'id': 2, 'category': -1, 'question': 0, 'answer': -1 },
      { 'id': 3, 'category': -1, 'question': -1, 'answer': 3 },
      { 'id': 4, 'category': -1, 'question': -1, 'answer': -1 },
    ]
    
[/code]

この配列内に格納されている各オブジェクトに対して値が `0` 未満であるキーを削除したい場合, つまり

[code]

    const items = [
      { 'id': 1 },
      { 'id': 2, 'question': 0 },
      { 'id': 3, 'answer': 3 },
      { 'id': 4 },
    ]
    
[/code]

以上のような結果を得たい場合, どのような方法が考えられるでしょうか？  
ライブラリとして [lodash](https://lodash.com/) が使える環境になります.


CC BY-SA 4.0
2020-12-02T11:54:56.650
72352
2020-12-06T02:07:52.370
2020-12-02T13:04:05.350
32986
42967
question
javascript array
オブジェクトの値に応じてキーを削除するには？


コメントにすでに回答があるので二番煎じではありますが、lodashを使わないパターンを記しておきます。

[code]

    const items = [
      { id: 1, category: -1, question: -1, answer: -1 },
      { id: 2, category: -1, question: 0, answer: -1 },
      { id: 3, category: -1, question: -1, answer: 3 },
      { id: 4, category: -1, question: -1, answer: -1 },
    ];
    
    /**
     * 愚直に書いた場合
     */
    const result1 = items.map(item =>
      Object.entries(item)
        .filter(([, value]) => value >= 0)
        .reduce((all, [key, value]) => ({ ...all, [key]: value }), {}),
    );
    
    /**
     * 今回の処理をフィルタリングの処理を任意に出来るように関数化した場合
     */
    function pickBy(list, filterFunction) {
      return list.map((obj) =>
        Object.entries(obj)
          .filter(([key, value]) => filterFunction(key, value))
          .reduce((all, [key, value]) => ({ ...all, [key]: value }), {}),
      );
    }
    
    const result2 = pickBy(items, (_, value) => value >= 0);
    
    console.log("==== result1 ====");
    console.log(JSON.stringify(result1, null, 2));
    console.log("==== result2 ====");
    console.log(JSON.stringify(result2, null, 2));
[/code]


CC BY-SA 4.0
2020-12-03T02:29:21.650
72359
2020-12-03T08:35:37.940
2020-12-03T08:35:37.940
32986
7997
72352
answer


「キーを削除」という表現から、 **破壊的処理** を期待していると想定しました。  
`delete` 演算子でプロパティを削除することが出来ます。

[code]

    'use strict';
    const items = [
      { 'id': 1, 'category': -1, 'question': -1, 'answer': -1 },
      { 'id': 2, 'category': -1, 'question': 0, 'answer': -1 },
      { 'id': 3, 'category': -1, 'question': -1, 'answer': 3 },
      { 'id': 4, 'category': -1, 'question': -1, 'answer': -1 },
    ];
    
    for (let item of items) {
      for (let [key, value] of Object.entries(item)) {
        if (value < 0) {
          delete item[key];
        }
      }
    }
    
    console.log(JSON.stringify(items)); // [{"id":1},{"id":2,"question":0},{"id":3,"answer":3},{"id":4}]
[/code]

Re: hitenMITSURUGIstyle さん


CC BY-SA 4.0
2020-12-06T02:07:52.370
72441
2020-12-06T02:07:52.370
20262
72352
answer