比 lodash 链更好、性能更高

kys*_*ick 1 javascript ecmascript-6 lodash

我在一些论坛上读到,为了更好的性能和代码的可读性,应该尽可能避免使用 lodash 链。那么有没有办法在集合上使用本机 javascript 函数来替换此代码。

_(userCollection).chain()
        .map('name')
        .compact()
        .uniq()
        .value();
Run Code Online (Sandbox Code Playgroud)

像这样的东西,但我不确定这样写是否会带来任何附加值

_.uniq(_.compact(userCollection.map('name')))
Run Code Online (Sandbox Code Playgroud)

Ori*_*ori 6

您可以使用_.flow()运行一系列方法:

const { flow, partialRight: pr, map, compact, uniq } = _;

const getUniqeNames = flow(
  pr(map, 'name'),
  compact,
  uniq
);

const arr = [{ name: 'John' }, {}, { name: 'Smith' }, {}, { name: 'John' }, { name: 'Smith' }] 

const result = getUniqeNames(arr);

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

Flow 使用lodash/fp效果更好,因为这些方法是 iteratee-first 和 data-last。这样就无需对每个需要参数的方法进行部分右移(pr(map, 'name')在 lodash 示例中)。

const { flow, map, compact, uniq } = _;

const getUniqeNames = flow(
  map('name'),
  compact,
  uniq
);

const arr = [{ name: 'John' }, {}, { name: 'Smith' }, {}, { name: 'John' }, { name: 'Smith' }] 

const result = getUniqeNames(arr);

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
Run Code Online (Sandbox Code Playgroud)