オブジェクトの値に応じてキーを削除するには？


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

[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/) が使える環境になります.




コメントにすでに回答があるので二番煎じではありますが、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]

