Javascript 使用下划线.JS进行深度拾取

Javascript 使用下划线.JS进行深度拾取,javascript,underscore.js,lodash,Javascript,Underscore.js,Lodash,我试图使用下划线来操作JavaScript对象,但在操作时遇到了问题 这是我的例子 var数据={ “标签”:“SomeName”, “家长”:[{ “id”:“parentId”, “资源”:[{ “名称”:“ID1NAME”, “电话”:[ “用户获取”、“用户2发布”、“用户3删除” ] }, { “名称”:“ID2”, “电话”:[ “员工1获取”、“员工2删除”、“员工3更新” ] }] }] }; var res=(数据).chain()。 拔毛(“父”)。 展平()。 findW

我试图使用下划线来操作JavaScript对象,但在操作时遇到了问题

这是我的例子

var数据={
“标签”:“SomeName”,
“家长”:[{
“id”:“parentId”,
“资源”:[{
“名称”:“ID1NAME”,
“电话”:[
“用户获取”、“用户2发布”、“用户3删除”
]
}, {
“名称”:“ID2”,
“电话”:[
“员工1获取”、“员工2删除”、“员工3更新”
]
}]
}]
};
var res=(数据).chain()。
拔毛(“父”)。
展平()。
findWhere(功能(项目){
item==“用户获取”
}).
value();

控制台日志(res)这似乎可以达到目的

函数findByCall(数据,调用){
返回u.find(data.parent,函数(parent){//从data.parent列表中,查找
return u.some(parent.resources,function(resource){//具有这样的parent.resource
return u.includes(resource.calls,call);//包括搜索到的resource.calls项
});
});
}
//试验
风险值数据={
“标签”:“SomeName”,
“家长”:[{
“id”:“parentId”,
“资源”:[{
“名称”:“ID1NAME”,
“电话”:[
“用户获取”、“用户2发布”、“用户3删除”
]
}, {
“名称”:“ID2”,
“电话”:[
“员工1获取”、“员工2删除”、“员工3更新”
]
}]
}]
};
log(findByCall(数据'user_get'))

您遇到的一个问题是使用
\uu.pull
。如果在对象上执行
,它将遍历对象的键,试图检索指定为第二个参数的属性(在本例中为“parent”)label'是一个字符串,“parent”是一个数组,因此您得到的数组是
[undefined,undefined]
。剩下的就会出问题

一种解决办法如下:

function findCallIndexInParent(call, parent) {
    return _.chain(parent)
            .pluck('resources')
            .flatten()
            .findIndex(function (obj) {
                return _.contains(obj.calls, call);
            })
            .value();
}

function findCall(call, data) {
    var parent = data.parent;
    return parent[findCallIndexInParent(call, parent)];
}

console.log(findCall('user_get', data));
findCall
只是一种方便的方法,它将数据的父属性传递给
findCallIndexInParent
(它将检索调用所在的索引),并返回所需的对象和父数组

(下划线的分支)提供了一个方法来获取一个对象的属性,而这个属性在这里非常方便(遗憾的是,下划线没有)

findCallIndexInParent
的解释如下:

function findCallIndexInParent(call, parent) {
    return _.chain(parent)
            .pluck('resources')
            .flatten()
            .findIndex(function (obj) {
                return _.contains(obj.calls, call);
            })
            .value();
}

function findCall(call, data) {
    var parent = data.parent;
    return parent[findCallIndexInParent(call, parent)];
}

console.log(findCall('user_get', data));
  • 链接父列表
  • 获取资源数组
  • 作为Pull贴图,它返回一个列表列表,因此需要展平
  • 查找调用包含调用的元素的索引
  • 返回父对象中包含调用的对象的值(索引)

  • 这是我的建议。希望有帮助。

    如果我理解正确,您希望获得
    父数组中元素的索引,该数组具有指定调用的任何资源

    数据={
    “标签”:“SomeName”,
    “家长”:[{
    “id”:“parentId”,
    “资源”:[{
    “名称”:“ID1NAME”,
    “电话”:[
    “用户获取”、“用户2发布”、“用户3删除”
    ]
    }, {
    “名称”:“ID2”,
    “电话”:[
    “员工1获取”、“员工2删除”、“员工3更新”
    ]
    }]
    }]
    }
    //查找父级的索引
    const index=uu.findIndex(data.parent,parent=>
    //那有(一些)资源吗
    _.some(parent.resources,resource=>
    //在其调用列表中包含“user_get”调用的
    _.contains(resource.calls“user\u get”)
    )
    )
    console.log(索引)//0

    您是否有机会将JSON包装到数组中?由于下划线使用的是集合(集合中确实包含一个容纳所有类型对象的数组),因此将JSON写入数组将解决您的问题@谢谢你的建议。我当然知道parse和JSON的含义。我可能错误地使用了parse这个词,但我将其称为JSON文档的意图是正确的,因为我一直在处理JSON文档。我给出了一个例子,跳过了将JSON文档解析为Javascript对象的部分。另外,恕我直言,你们用的词是不正确的,摘录就好了。我尊重别人:)我感谢你的帮助。谢谢你清楚的解释。感谢您的时间和帮助。