如何从javascript中获取数组对象的过滤结果?

时间:2015-09-07 14:54:20

标签: javascript filter

我试图从匹配为真的json中获取过滤结果。

{
        "cat": [
            {
                "volume": "one",
                "category": [
                    {
                        "name": "Alpha",
                        "matched": true
                    },
                    {
                        "name": "Gamma",
                        "matched": false
                    }
                ]
            },
            {
                "volume": "two",
                "category": [
                    {
                        "name": "Beta",
                        "matched": false
                    },
                    {
                        "name": "Treta",
                        "matched": true
                    },
                    {
                        "name": "Neutral",
                        "matched": false
                    }
                ]
            },
            {
                "volume": "three",
                "category": [
                    {
                        "name": "Retro",
                        "matched": false
                    },
                    {
                        "name": "Jazz",
                        "matched": true
                    },
                    {
                        "name": "Rock",
                        "matched": false
                    },
                    {
                        "name": "Soft",
                        "matched": false
                    }
                ]
            }
        ]
}

使用过的Javascript过滤器

var jsonwant = jsonusing.cat.filter(function(e){
    return e.category.filter(function(e1){
        return e1.matched === true;
});
});

Js Fiddle同样

http://jsfiddle.net/xjdfaey3/

结果应该是

"cat": [
                {
                    "volume": "one",
                    "category": [
                        {
                            "name": "Alpha",
                            "matched": true
                        }
                    ]
                },
                {
                    "volume": "two",
                    "category": [
                        {
                            "name": "Treta",
                            "matched": true
                        }
                    ]
                },
                {
                    "volume": "three",
                    "category": [
                        {
                            "name": "Jazz",
                            "matched": true
                        }
                    ]
                }
            ]

但它正在返回整个对象。

2 个答案:

答案 0 :(得分:4)

我喜欢@dsfq的回答。你可能会在没有库的情况下使用简单的Javascript。但是我在一个JS函数式编程库Ramda上工作,它提供了一些工具来使这样的问题更容易处理。这是使用Ramda执行此操作的单行函数:

evolve({'cat': map(evolve({category: filter(whereEq({'matched': true}))}))});

说明

whereEq接受一个模板对象,并返回一个谓词函数,该函数将接受另一个对象并检查此新对象是否具有与模板对象的键相同的值。我们传递它{'matched': true},因此它接受一个对象并检查该对象是否具有匹配的'值为true的属性。 (这有点过于简单了。功能,就像大多数Ramda函数实际上是自动计算的,并且最初会接受测试对象,但由于我们不提供它,它只是返回一个期待它的新函数。以下功能的行为方式相同,我不会为每个功能提及。)

whereEq生成的函数将传递给filterFilter接受谓词函数(测试其输入并返回truefalse)并返回一个接受对象列表的函数,返回一个仅包含那些对象列表的新列表该函数返回true

使用它,我们创建一个传递给evolve的对象。此函数接受将属性对象映射到转换函数的配置对象。它返回一个接受对象并返回其副本的新函数,除非在配置对象中声明了转换函数。在那里它返回针对来自对象的数据运行该转换的结果。在我们的示例中,它将运行我们刚刚针对category属性构建的过滤器。

此处生成的函数传递给map,它接受​​一个函数并返回一个接受列表的新函数,并返回将该函数应用于列表的每个元素的结果。这将最终成为卷的集合。

现在,此map来电的结果将再次传递给evolve,以便物业“猫”#39}最外层的物体。这是最后的功能。您可以在 Ramda REPL 中看到它。

我并没有试图声称这本质上更好。但是,帮助您从更高级别的抽象中查看问题的工具通常可以让您编写更简洁的代码。

答案 1 :(得分:3)

您还需要在过滤后修改内部array[1] = (int)textBox1.Text; array[2] = (int)textBox2.Text; 数组:

category

请注意,这也会修改原始对象。

UPD。为了保留原始结构,需要再创建一个映射步骤来创建新数组:

var jsonwant = jsonusing.cat.filter(function(e){
    return (e.category = e.category.filter(function(e1){
        return e1.matched === true;
    })).length;
});