Javascript &引用;皮克比;对象的值数组中的值

Javascript &引用;皮克比;对象的值数组中的值,javascript,lodash,Javascript,Lodash,我有一个对象看起来像: let documents = {"A": [{"document":"test1", "serial":"123"}, {"document":"test2", "serial":"456N"}], "B": [{"document":"test3", "serial":"789N"}, {"document":"test24, "serial":"012"}]}; 我试图获取序列号以“N”结尾的筛选对象: 我在做: let result = _.pickBy(do

我有一个对象看起来像:

let documents = {"A": [{"document":"test1", "serial":"123"}, {"document":"test2", "serial":"456N"}], "B": [{"document":"test3", "serial":"789N"}, {"document":"test24, "serial":"012"}]};
我试图获取序列号以“N”结尾的筛选对象:

我在做:

 let result = _.pickBy(documents, (docObjs, client) => {
       return _.filter(docObjs, ({serial}) => {
         return _.endsWith(serial, 'N');
       });
 });

但我得到的是原始对象(与
文档
相同)。有什么问题吗?

只要使用JS
ES6
,您就可以使用
reduce
循环遍历对象键
筛选
数组,并使用
endsWith
检查字符串是否以N结尾

let documents={“A”:[{“document”:“test1”,“serial”:“123”},{“document”:“test2”,“serial”:“456N”}],“B”:[{“document”:“test3”,“serial”:“789N”},{“document”:“test24”,“serial”:“012”}]};
让结果=对象。键(文档)。减少((c,v)=>{
c[v]=文档[v].过滤器(o=>o.serial.endsWith(“N”);
返回c;
}, {});

控制台日志(结果)
只需使用JS
ES6
,就可以使用
reduce
循环遍历对象键
筛选
数组,并使用
endsWith
检查字符串是否以N结尾

let documents={“A”:[{“document”:“test1”,“serial”:“123”},{“document”:“test2”,“serial”:“456N”}],“B”:[{“document”:“test3”,“serial”:“789N”},{“document”:“test24”,“serial”:“012”}]};
让结果=对象。键(文档)。减少((c,v)=>{
c[v]=文档[v].过滤器(o=>o.serial.endsWith(“N”);
返回c;
}, {});

控制台日志(结果)洛达斯

使用迭代客户端对象。对于每个客户机,使用的文档列表。如果文档列表不是(长度为0),请将具有筛选文档列表的客户端分配给结果对象:

//添加了将被过滤掉的客户端C
const documents={“A”:[{“document”:“test1”,“serial”:“123”},{“document”:“test2”,“serial”:“456N”}],“B”:[{“document”:“test3”,“serial”:“789N”},{“document”:“test24”,“serial”:“012”}],“C”:[{“document”:“test25”,“serial”:“013”}];
const result=\转换(文档,(r,v,k)=>{
const docs=u.filter(v,({serial})=>uu.endsWith(serial,'N'));
如果(!.isEmpty(docs))r[k]=docs;
});
控制台日志(结果)

Lodash

使用迭代客户端对象。对于每个客户机,使用的文档列表。如果文档列表不是(长度为0),请将具有筛选文档列表的客户端分配给结果对象:

//添加了将被过滤掉的客户端C
const documents={“A”:[{“document”:“test1”,“serial”:“123”},{“document”:“test2”,“serial”:“456N”}],“B”:[{“document”:“test3”,“serial”:“789N”},{“document”:“test24”,“serial”:“012”}],“C”:[{“document”:“test25”,“serial”:“013”}];
const result=\转换(文档,(r,v,k)=>{
const docs=u.filter(v,({serial})=>uu.endsWith(serial,'N'));
如果(!.isEmpty(docs))r[k]=docs;
});
控制台日志(结果)

当您只有一个文档(一个对象)时,
文档为什么是复数的?为什么
client\u name
引用的值不止一个(一个数组)时是单数的?@user633183我更新了描述,这样就不会让您感到困惑。为什么
文档
只有一个(对象)时是复数的?为什么
client\u name
引用的值不止一个(一个数组)时是单数的?@user633183我更新了描述,这样就不会让你感到困惑。1)你在执行浅层克隆2)如果你在使用lodash,为什么不使用lodash的
clone
?3) 你不需要克隆谢谢你。如果
文档中有多个键
,我能知道该怎么办吗?我想这就解释了@user633183的问题:我写它们节省了一些时间,但实际对象有多个键和值。@user633183。是的,你是对的,我不需要克隆它,但在OP上希望输出像
{client_name:[..]}
@jsh6303多个键是什么意思?:)你想同时过滤Eddie和Joe吗?1)你在执行浅层克隆2)如果你在使用lodash,为什么不使用lodash的
克隆
?3) 你不需要克隆谢谢你。如果
文档中有多个键
,我能知道该怎么办吗?我想这就解释了@user633183的问题:我写它们节省了一些时间,但实际对象有多个键和值。@user633183。是的,你是对的,我不需要克隆它,但在OP上希望输出像
{client_name:[..]}
@jsh6303多个键是什么意思?:)你想过滤埃迪和乔吗?
 let result = _.pickBy(documents, (docObjs, client) => {
       return _.filter(docObjs, ({serial}) => {
         return _.endsWith(serial, 'N');
       });
 });