Javascript 将参数传递给lodash\u0.result
对于第二个属性是方法名的情况,是否有方法将参数传递给lodashJavascript 将参数传递给lodash\u0.result,javascript,arguments,lodash,Javascript,Arguments,Lodash,对于第二个属性是方法名的情况,是否有方法将参数传递给lodash\uUresult?或者是否有其他方法(最好是lodash)来实现这一点 用法示例如下所示: var object = { 'cheese': 'crumpets', 'stuff': function( arg1 ) { return arg1 ? 'nonsense' : 'balderdash'; } }; _.result(object, 'cheese'); // => 'crumpets'
\uUresult
?或者是否有其他方法(最好是lodash)来实现这一点
用法示例如下所示:
var object = {
'cheese': 'crumpets',
'stuff': function( arg1 ) {
return arg1 ? 'nonsense' : 'balderdash';
}
};
_.result(object, 'cheese');
// => 'crumpets'
_.result(object, 'stuff', true);
// => 'nonsense'
_.result(object, 'stuff');
// => 'balderdash'
谢谢。我查看了lodash uuz.result函数的源代码,但不支持此功能。您可以为此实现您自己的函数,并使用z.扩展lodash
您可以创建自己的mixin。下面是一个使用即将发布的lodash 4.0.0的示例
var reisedeepprop=/\.\124\[(?:[^[\]]*|([“'))(?:(?!\ 1)[^\]\124\]*?\ 1)\]/;
var reisplanprop=/^\w*$/;
变量rePropName=/[^.[\]+\[(?:(?:(?:\.\d+))([“'))((?:(?!\2)[^\\].\\)*?)\2)\]/g;
var reEscapeChar=/\\(\\)?/g;
函数isKey(值、对象){
如果(值的类型=='number'){
返回true;
}
返回!\u0.isArray(值)&&
(Reisplanprop.test(value)| |!Reisplanprop.test(value)||
(object!=对象(object)中的null&&value);
}
函数stringToPath(字符串){
var结果=[];
_.toString(字符串).replace(重新编程名,函数(匹配,编号,引号,字符串){
result.push(引号?string.replace(reEscapeChar,$1'):(数字| |匹配));
});
返回结果;
}
函数baseToPath(值){
返回i.isArray(值)?值:stringToPath(值);
}
函数父级(对象、路径){
返回path.length==1?对象:0.get(对象,0.slice(路径,0,-1));
}
函数customResult(对象、路径、参数、默认值){
如果(!isKey(路径,对象)){
路径=基本路径(路径);
var result=get(对象、路径);
对象=父对象(对象、路径);
}否则{
结果=对象==null?未定义:对象[路径];
}
如果(结果===未定义){
结果=默认值;
}
返回0.isFunction(result)?result.apply(对象,0.isArrayLike(args)?args:[]):结果;
}
_.米辛({
“customResult”:customResult
});
变量对象={
‘奶酪’:‘脆饼’,
“stuff”:函数(arg1){
返回arg1?胡说八道:'balderdash';
}
};
var out=document.getElementById('out');
out.textContent=\.customResult(对象'cheese')+'\n';
//=>“crumpets”
out.textContent+=\.customResult(对象,'stuff',[true])+'\n';
//=>“胡说八道”
out.textContent+=\.customResult(对象'stuff')+'\n';
//=>“balderdash”
下面是另一个mixin实现:
function myResult(obj, path, defaultValue) {
// Find any arguments beyond what's normally
// passed to result().
var args = _.drop(arguments, 3);
// We need to know upfront whether or not this
// is a function we're dealing with.
var isFunc = _.isFunction(_.get(obj, path));
// If this is a function, and there's arguments
// to apply, then use spread() and bindKey() to
// return the result of calling the method with arguments.
// Otherwise, it's just a plain call to result().
if (isFunc && args.length) {
return _.spread(_.bindKey(obj, path))(args);
} else {
return _.result(obj, path, defaultValue);
}
}
_.mixin({ myResult: myResult });
我们的想法是,我们只需要处理添加的情况,其中path
是一个函数,并且传递了额外的参数。否则,我们将返回基本的result()
实现
_.myResult(object, 'test');
// → undefined
_.myResult(object, 'test', 15);
// → 15
_.myResult(object, 'cheese', 'wine');
// → "crumpets"
_.myResult(object, 'stuff');
// → "balderdash"
_.myResult(object, 'stuff', null, true);
// → "nonsense"
现在可以使用lodash v4方法执行此操作,但是,如果尝试调用非函数的内容(未定义的道具也可以),则会引发错误:
var对象={
‘奶酪’:‘脆饼’,
“stuff”:函数(arg1){
返回arg1?胡说八道:'balderdash';
}
};
试一试{
var rst1=u2;.invoke(对象“cheese”);
//=>“错误!!”
}捕获(e){
log('错误:cheese不是函数');
}
var rst2=u2;.invoke(对象'stuff',true);
console.log(rst2);//=>'胡说八道
var rst3=u3;.invoke(对象“stuff”);
console.log(rst3);//=>'巴尔德达什'
var rst4=512;.invoke(对象“bob”);
console.log(rst4);//=>'未定义的“
文档似乎没有显示任何方法来实现这一点(如果我理解正确的话),因此我猜测这是不受支持的。你可以在这里要求确定,甚至要求它作为一个附加功能。想法很清楚,谢谢。因此,它似乎解决了更一般的任务,比如deepresult
?在方法中,customResult
应该是方法.get
,然后是.slice
,而不是.slice
。是的,这个解决方案的工作原理与原始的.result
一样,它只是将args
参数添加到方法中。刚刚透露了关于deepresult
,这可能是因为3d版本。在2d版本中,结果
并不深入。正如我所说,此解决方案基于即将发布的v4.0.0,因此我确信与以前的版本相比有很多改进。感谢非常简单的解决方案!请注意,此解决方案并没有以多种方式提供\uresult
的全部功能。
_.myResult(object, 'test');
// → undefined
_.myResult(object, 'test', 15);
// → 15
_.myResult(object, 'cheese', 'wine');
// → "crumpets"
_.myResult(object, 'stuff');
// → "balderdash"
_.myResult(object, 'stuff', null, true);
// → "nonsense"