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

这是我到目前为止的解决方案:

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 回答
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 存储在密钥中。遍历 JSON 时会遇到问题,因为您的“itemFoo”将使用“foo”(间接)来获取其值。您的数据结构是这里的问题。搜索您的 JSON 很棘手。一旦你遵循了规则,你的代码就会自动变得优雅。

于 2013-02-15T11:22:48.733 回答