如何在javascript中从数组对象获取筛选结果?

如何在javascript中从数组对象获取筛选结果?,javascript,filter,Javascript,Filter,我正试图从json中得到匹配结果为true的过滤结果 { "cat": [ { "volume": "one", "category": [ { "name": "Alpha", "matched": true },

我正试图从json中得到匹配结果为true的过滤结果

{
        "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提琴也一样

结果应该是

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

但它将返回整个对象。

您还需要在过滤后修改内部
类别
数组:

var jsonwant = jsonusing.cat.filter(function(e){
    return (e.category = e.category.filter(function(e1){
        return e1.matched === true;
    })).length;
});
请注意,这也将修改原始对象

UPD.为了保留原始结构,需要再执行一个映射步骤来创建新阵列:

var jsonwant = jsonusing.cat.map(function(e) {
    return {
        volume: e.volume,
        category: e.category.filter(function(e1){
            return e1.matched === true;
        })
    };
})
.filter(function(e) {
    return e.category.length;
});
我喜欢你的回答。这可能与使用简单Javascript而不使用库一样好。但是我在一个JS函数式编程库中工作,它提供了一些工具,可以让类似这样的问题变得更容易处理。下面是一个使用Ramda执行此操作的单行函数:

evolve({'cat': map(evolve({category: filter(whereEq({'matched': true}))}))});
解释 接受一个模板对象并返回一个谓词函数,该函数将接受另一个对象并检查这个新对象是否具有与模板对象键相同的值。我们传递它
{'matched':true}
,因此它接受一个对象并检查该对象是否具有值为
true
的'matched'属性。(这有点过于简单了。该函数与大多数Ramda函数一样,实际上是自动生成的,最初会接受测试对象,但由于我们不提供测试对象,它只会返回一个需要它的新函数。下面所有函数的作用方式都是相同的,我不会一一提及。)

生成的函数,其中eq
被传递给
Filter
接受一个谓词函数(测试其输入并返回
true
false
)并返回一个函数,该函数接受一个对象列表,返回一个新的列表,该列表仅由函数返回的对象组成
true

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

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

现在,此
map
调用的结果再次传递到最外层对象的属性“cat”的
evolve
。这是最后一个函数。您可以在中看到它的作用



我并不是说这天生就更好。但是,帮助您从更高抽象级别查看问题的工具通常可以让您编写更简洁的代码。

您需要在双过滤器中添加一个中间步骤
e.category.filter(函数(e1){返回e1.matched==true;})做你想做的事,但是,因为它将返回到另一个筛选器,所以它将保留整个对象。是否要修改原始对象,或者在筛选后同时使用这两个对象?是否希望它返回那些没有类别匹配的卷?是,如果匹配为真,则我希望返回这些卷@Scottsauyet,但如果卷没有有匹配项的类别,该卷是否应包含在输出中,例如
{volume:“four”,categories:[]}
?还是应该从输出中排除该音量?它工作得很好。我对javascript有点陌生。你能解释一下内部JSON是如何被过滤的吗。这将有很大帮助。对于
cat
数组中的每个对象,您还需要更新内部
e.category
数组,因为它也需要过滤。因此,您可以使用过滤版本覆盖
e.category
。然后,您需要返回真/假(或1/0-在筛选器中也将转换为真/假),以便筛选外部
cat
数组的项。