0

私は、(残念ながら!) 私の範囲外にある JS オブジェクトからオブジェクト プロパティの名前を取得するこの作業コードを持っています。したがって、このオブジェクトの構築方法を変更することはできません。trueしかし、このオブジェクトをより簡単に処理できるように、 としてマークされているプロパティの名前を配列として抽出したいと考えています。

物体:

{
    group1: {
        foo: true,
        itemFoo: "Name of foo", // This is what I want, because foo is true
        bar: false,
        itemBar: "Name of bar", // I dont want this, bar is false
        // ...
    },
    group2: {
        baz: true,
        itemBaz: "Name of baz", // I want this too
        // ...
    },
    uselessProp1: "not an object",
    // ...
}

作業コード:

var items = [];

for (var m in obj) {
    if (typeof obj[m] == 'object') {
        for (var n in obj[m]) {
            if (obj[m][n] === true) {
                items.push(obj[m]['item' + (n.charAt(0).toUpperCase() + n.slice(1))]);
            }
        }
    }
}

私の質問は、underscore.jsまたはプレーンnode.jsまたはその他のライブラリを使用してこのトラバーサルを実現するよりエレガントな方法を知っている人はいますか? で実験し_.filterましたが、解決策が思いつきませんでした。

4

3 に答える 3

1

私は何かを指摘したいと思います:

Micha’s Golden Rule
Micha Gorelick, a data scientist in NYC, coined the following rule:
Do not store data in the keys of a JSON blob.

JSON を使用する必要があります。

{//group1
  groupname:"group1",
  items :[
    {//item1
       itemcheck:true,
       itemname:'itemBar'
    },
    ...
  ]
},
...

itemname をキーに格納する場合。「itemFoo」は「foo」を(間接的に)使用してその値を取得するため、JSON をトラバースするときに問題が発生します。あなたのデータ構造は、ここで問題です。JSON の検索はトリッキーです。ルールに従えば、コードは自動的にエレガントになります。

于 2013-02-15T11:22:48.733 に答える
1

これは私がこれまでにやってきた解決策です:

http://jsfiddle.net/kradmiy/28NZP/

var process = function (obj) {
var items = [];

var objectProperties = _(obj).each(function (rootProperty) {
    // exit from function in case if property is not an object
    if (!_(rootProperty).isObject()) return;

    _(rootProperty).each(function (value, key) {
        // proceed only if property is exactly true
        if (value !== true) return;
        var searchedKey = 'item' + (key.charAt(0).toUpperCase() + key.slice(1));
        // check that parent has this property...
        if (rootProperty.hasOwnProperty(searchedKey)) {
            // ...and push that to array
            items.push(rootProperty[searchedKey]);
        }
    });
});

  return items;
};
于 2013-02-15T09:58:22.427 に答える
1

このようなもの?

var result = [];
_.chain(obj).filter(_.isObject).each(function(t) {
    _(t).each(function(val, key) {
        if(val === true)
            result.push(t['item' + key.charAt(0).toUpperCase() + key.substr(1)])
    })
})
于 2013-02-15T09:37:39.017 に答える