使用JavaScript按键值过滤JSON

使用JavaScript按键值过滤JSON,javascript,arrays,json,filter,Javascript,Arrays,Json,Filter,给定users.json中的对象数组: {"key":"userSubscriptions","value": [{"channel":"Netflix","user":"Bobby","region":"NA"}, [{"channel":"Netflix","use

给定users.json中的对象数组:

{"key":"userSubscriptions","value":
[{"channel":"Netflix","user":"Bobby","region":"NA"},
[{"channel":"Netflix","user":"Bobby","region":"EU"},
[{"channel":"Netflix","user":"Jamie","region":"SEA"},
[{"channel":"Prime Video","user":"Bobby","region":"NA"}]}
一个过滤器将如何处理最终结果

console.log(result); // Bobby, your region subscriptions are: Netflix: (NA, EU), Prime Video: (NA)
谢谢大家!


编辑:我尝试使用.filter()和.map()方法,但到目前为止运气不佳

您必须使用lodash对数据进行分组,然后映射数据

var data = {
                "key":"userSubscriptions",
                "value":
                [{"channel":"Netflix","user":"Bobby","region":"NA"},
                {"channel":"Netflix","user":"Bobby","region":"EU"},
                {"channel":"Netflix","user":"Jamie","region":"SEA"},
                {"channel":"Prime Video","user":"Bobby","region":"NA"}]
            }

            var users = _.chain(data.value)
                .groupBy("user").map((value, key) => ({ user: key, data: value })).value();

                users.forEach(element => {
                    console.log(element)

                    console.log(`${element.user}, your region subscriptions are: Netflix: ${element.data.map(c=>c.channel).join(',')}, Prime Video: ${element.data.map(c=>c.region).join(',')}`)
                });

您的JSON数据无效。不过,我想我是根据你的意图改编的

这将数据分解为按用户格式,并提供一个函数来输出任何命名用户的订阅和区域

const jsonString=`{“key”:“userSubscriptions”,“value”:[{“channel”:“Netflix”,“user”:“Bobby”,“region”:“NA”},{“channel”:“Netflix”,“user”:“Bobby”,“region”:“EU”},{“channel”:“Netflix”,“user”:“Jamie”,“region”:“SEA”},{“channel Prime Video”,“user”:“Bobby”,“region”:“NA”}};
const obj=JSON.parse(jsonString);//将数据从字符串解析为对象
constbyuser=obj.value.reduce((acc,o)=>{//将“value”数组缩减为单个对象
if(!acc[o.user])acc[o.user]={};//如果acc.userName不存在,则创建它
如果(acc[o.user][o.channel])acc[o.user][o.channel].push(o.region);//如果acc.userName.channelName有数组,则将此区域添加到其中
else acc[o.user][o.channel]=[o.region];//else创建一个包含此区域的数组
return acc;//为下一次迭代保留创建的对象
}, {});
函数printForUser(userName){//创建一个使用用户名的函数
const user=byUser[userName];//从byUser对象获取用户对象
return Object.keys(user).reduce((acc,k)=>{//将用户对象的键减少为一个字符串
返回acc+`${k}:(${user[k].join(“,”}),`;//在每个订阅和区域上添加
},`${userName},您的区域订阅是:`).slice(0,-1);//初始化字符串并删除最后一个逗号
}

控制台日志(printForUser(“Bobby”)
SO不是免费的代码编写服务。到目前为止,您自己尝试了什么来解决这个问题?这显然是无效的,您有4个
[
和1个
]
过滤JSON是一个噩梦,将其转换为JS对象,然后过滤该JS对象。@Teemu“过滤JSON是一个噩梦”-如何过滤字符串?o、 o“您必须使用lodash对数据进行分组”-不,OP不必仅为此目的使用库。使用本机对象和方法很容易做到这一点。因为问题不清楚,所以我认为他希望为所有用户打印出来