2016-09-25 1 views
1

nongモジュールtraverseを使用して、mongodb/mongooseからのデータをフィルタリングしています。トラバースjsオブジェクトプロパティは、玉表示の文字列に引用符を追加します。

私は、このデータを取得する可能性があります:

[ { rating: 5, 
    title: { da: 'Web udvikling', en: 'Web Development' } }, 
    { rating: 5, title: { da: 'Node.js', en: 'Node.js' } } ] 

'ダ' と 'エン' は言語を示します。私はこのような現在の言語後マングースデータをフィルタリングするtraverseを使用します。

var filtered = filterLanguage(lang, results); 
// filter json obj by language 
var filterLanguage = function(language, obj) { 
    return traverse(obj).map(function (item) { 
     if (this.key === language) { 
      this.parent.update(item); 
     } 
    }); 
}; 

私はその後、私のテンプレートでこれを示しています。

res.render('index', { 
    skills: filtered.skills 
}); 

最後に、私はヒスイビューで表示:

ul.list-group 
    each skill, i in skills 
     if i < 5 
      li.list-group-item.sidebar-list-item= skill.title 

残念ながら、それは引用符で表示されます:

<ul> 
    <li>'Web Development'</li> 
    <li>'Node.js'</li> 
</ul> 

これらの引用符はフィルタリングされていないデータ(results.skill.title.da)にはありません。トラバースが追加されます。私は '普通の' jsonとモジュールを使用し、それは完全に動作しています。

mongooseのデータは簡単でシンプルですが、プロトタイプには多くのプロパティがあります。また、結果セットから '_id'(型bson/objectid型)プロパティを省略しないと、トラバースを停止します。

トラバースでは、マングースのデータに問題があるようです...これはなぜですか?それをどうやって修正することができますか? EDIT - -


私は解決策が見つかりました: var json = JSON.parse(JSON.stringify(results)); var filtered = filterLanguage(lang, json); これは引用符を削除しますが、私はまさにそれはわからない:私はこれを行うフィルタリング前

をそうです。何とかmongooseの結果をJSONに変換しますか?説明は高く評価されるだろう。

答えて

0

マングース文書のフィールドはゲッター/セッターで、traverseまたはJade/Pugのどちらかを混乱させるようです。

私はそれがあなたの問題のすべてを解決するよう見つかった最短の方法はかなり醜いです:

var filtered = filterLanguage(lang, results.map(r => JSON.parse(JSON.stringify(r)))); 

より精巧なバージョン:

var filtered = filterLanguage(lang, results.map(r => { 
    let j = r.toJSON() 
    j._id = j._id.toString() 
    return j; 
})); 
0

何であるかを見て参考にされているだろう本体がfilterLanguageのものであるかどうかを正確に理解するか、2度呼び出された理由を理解していますが、それはそのままではtraverseパッケージを使用する必要はありません。

以下のような関数がトリックを行う必要があります。データがツリーのようになり、例のように平坦でない場合は、それを拡張して動作さえします。

const reduceByLang = (data, lang) => { 
    // Look for a `lang` key in obj or 
    // if not found but still an object, recurse 
    const reduceByLangObj = (obj) => { 
    Object.keys(obj).forEach((key) => { 
     if (obj[key] === null) { 
     return; 
     } 
     if (obj[key][lang]) { 
     obj[key] = obj[key][lang]; // replace with desired lang 
     } else if (typeof obj[key] === 'object') { 
     reduceByLangObj(obj[key]); // recurse 
     } 
    }); 
    return obj; 
    }; 

    if (Array.isArray(data)) { 
    return data.map(reduceByLangObj); 
    } else { 
    return reduceByLangObj(data); 
    } 
}; 

JS Binの例を参照してください。また

、すべての可能な場合、あなたは非常に頻繁に選択のこのタイプをすれば、私は別の構造体にデータを保存するになります。

多分

{ ratings: x, locales: { en: { title: 'Y' }, { da: { title: 'Z' } } } }

、あなたが選ぶことができるようにクエリ自体および/またはコントローラ内で簡単に選択された言語を使用できます。

EDIT:nullをチェックしてください。

+0

質問にfilterLanguage()メソッド本文が含まれていました。これは2回呼び出されるべきではありません。それはタイプミスです。一度だけ - それに更新された質問。 – olefrank

+0

解決策reduceByLangは私にこのエラーを与えます: "TypeError:未定義のプロパティ 'da'を読み取ることができません。 – olefrank

+0

興味深いことに、配列や関数などをデータに追加しようとしましたが、正確なエラーを再現できませんでしたアレイ。プロパティが 'null'でも同じエラーではなかった場合は壊れた唯一のものです。あなたは完全なデータの構造についてもっと分かち合いたいですか? – shariffy

関連する問題