Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用lodash链接函数?_Javascript_Lodash - Fatal编程技术网

Javascript 如何使用lodash链接函数?

Javascript 如何使用lodash链接函数?,javascript,lodash,Javascript,Lodash,我有一个物体看起来像 var foundUser = { charData: [] } 然后我使用mysql从数据库中加载一个对象,然后调用 _.assignIn(foundUser, rows[0]); 但是我得到了一些我不需要的额外属性(使用select无法解决这个问题) 所以我打电话 foundUser = _.omit(foundUser, ['blah']); 但如果我能做到这一点就好了 _.assignIn(foundUser, rows[0]).omit(rows[0

我有一个物体看起来像

var foundUser = {
    charData: []
}
然后我使用mysql从数据库中加载一个对象,然后调用

_.assignIn(foundUser, rows[0]);
但是我得到了一些我不需要的额外属性(使用select无法解决这个问题)

所以我打电话

foundUser = _.omit(foundUser, ['blah']);
但如果我能做到这一点就好了

_.assignIn(foundUser, rows[0]).omit(rows[0], ['blah']);

但这会引发一个错误,是我做错了还是有其他方法可以做到这一点?

要与lodash链接,首先必须包装对象:

_(foundUser).assignIn(rows[0]).omit(['blah']).value();
进一步澄清:

创建一个lodash对象,该对象允许隐式方法链接。隐式方法链接意味着,在某些情况下,它可能返回一个基本值,在其他情况下,它可能返回一个lodash对象,您需要通过调用该对象上的
.value()
来展开该对象

如果您使用
。.chain(…)
,那么您将使用显式方法链接创建一个lodash对象。结果始终是一个包装的值,并且始终需要通过对其调用
.value()
来展开

以下是指向文档的链接,以供进一步参考:


作为包裹链展开模式的替代方案(它本身没有问题,但替代方案总是很有趣),您可以通过另一种方式进行检查

通过杠杆作用来尝试

其思想是
flow
中的每个函数都将接收前一个函数的输出作为输入,这正是您所需要的。 例如,给定此数据:

var foundUser = {
    charData: []
};

var rows = [{ok: 1, blah: 'nope'}];
使用,我们可以将数据作为最后一个参数传递。此功能以及Lodash/fp中每个方法的自动转换,使我们在编写函数时更加轻松。这意味着我们可以有一个简洁而富有表现力的代码:

_.flow(
 _.assign(rows[0]),
 _.omit('blah')
)(foundUser);

// >> {"charData":[],"ok": 1}
使用Lodash的标准版本,我们必须自己使用
.partial
来实现这些函数,代码看起来肯定不会那么简洁,但仍然可以这样做:

_.flow(
 _.partialRight(_.assign, rows[0]),
 _.partialRight(_.omit, 'blah')
)(foundUser);

// >> {"charData":[],"ok": 1}
使用流而不是链接的一大好处是,您可以轻松地将Lodash方法与自己的自定义函数混合使用,因为-如前所述- 他们所需要的只是作为输入的数据和作为输出的数据,而不是其他:

const yourFunction = d => ({ ...d, yourProp: 4 });

_.flow(
 _.assign(rows[0]),
 yourFunction,
 _.omit('blah')
)(foundUser);

// >> {"charData":[],"ok": 1, yourProp: 4}
这使得函数组合更容易、更灵活,而且可以说会自然产生更具表现力的代码

还有一件事需要注意。如果只安装和导入所使用的Lodash方法,则必须只添加
flow
包,而不是像使用链接那样添加整个Lodash库

npm i --save lodash.flow
Vs

在许多实际应用程序中,Lodash的完整构建可能是一个可以忽略不计的优势,在这些应用程序中,Lodash的完整构建不是问题,而且可以说更易于维护最新版本,但在编写库或脚本以作为第三方工具分发时非常方便。在这种情况下,就分布的大小而言,您将能够保持较低的占地面积

洛达斯方法文件:

值得一看的文章:

  • (免责声明:我写的)
还有几件事需要注意:

  • 在Lodash/fp中,Flow的别名为
    \uuu.pipe
    ,因此您可以选择您喜欢的选项

  • 如果您更喜欢从右到左组合,也可以使用
    .flowRight
    (或其
    fp
    别名
    .compose
    ),如中所示

例如:

_.flow(
 _.assign(rows[0]), // #1st to execute
 yourFunction,  // #2
 _.omit('blah'),  // #3
)(foundUser);

// is the same as...

_.flowRight(
 _.omit('blah'), // #3rd to execute
 yourFunction, // #2
 _.assign(rows[0]), // #1
)(foundUser);
你试过吗?它具有所有相同的函数,但它们都是经过修饰的,没有一个会改变输入

因此,你可以用一种非常好的方式来创作它们

例如:

_.flow(
 _.assign(rows[0]), // #1st to execute
 yourFunction,  // #2
 _.omit('blah'),  // #3
)(foundUser);

// is the same as...

_.flowRight(
 _.omit('blah'), // #3rd to execute
 yourFunction, // #2
 _.assign(rows[0]), // #1
)(foundUser);
从“时刻”导入时刻
从“lodash/fp”导入{compose、filter、groupBy、size、sortBy}
const fromAdmin=filter({type:'admin'})
const groupedByDate=groupBy(message=>moment(message.createdAt.format('yyyyymmdd'))
const sorted=sortBy('createdAt')
const unreadByUser=filter({isReadByUser:false})
const groupedMessages=compose(
按日期分组,
分类,
未读的尤瑟,
fromAdmin,
)(留言)

链是lodash中管道的最佳等价物

_.chain(foundUser)
 .assignIn(rows[0])
 .omit(['blah'])
 .value()
您还可以通过
。点击
。通过
链接一些自定义功能,例如:

_.chain(foundUser)
 .assignIn(rows[0])
 .tap(console.log)
 .omit(['blah'])
 .value()

我想不出你需要它的理由,但如果你想更明确地说明它,还有一个`..chain(foundUser)`如果你想对它发表同样的评论,你不必包装object@RobM. 如果您仍在包装对象,那么更明显的是,从您的examples@BabluAhmed确保导入的是Lodash的FP版本(
import uu2;自'Lodash/FP
),而不是“标准”版本(
import 2;自'Lodash'
)然后@Nobita,在这里相应地提到代码version@BabluAhmed它就在“使用Lodash FP我们可以通过…”的解释中,还有一个到回购协议的链接。如果您觉得应该用不同的措辞,请随意编辑,毕竟我们是这样的:)。干杯