Underscore / Lodash vs. From Scratch

时间:2017-11-20 22:08:25

标签: javascript angularjs underscore.js lodash

我是学生,最近开始使用Underscore和/或Lodash,而英语是我的第二语言,我有时很难理解这些Underscore / Lodash功能究竟在做什么。

我特别感兴趣的是如何解决我现在正在处理的这种情况...假设我有一个对象数组,而这些对象又包含一个文档数组;如果我想确定其中一个文档是否属于某种类型,如果是,则返回与该文档关联的对象。所以在我的情况下,我正在处理一组Invoice对象,而这些对象又有一个文档数组,为了解决这个问题,我使用了以下JavaScript代码:

let invoice = null;

for(let i = 0; i < $scope.invoices.length; i++){
    let docs = $scope.invoices[i].documents;
    if(docs && docs.length){
       for(let j = 0; j < docs.length; j++) {
           if(docs[j].type === 'document_xxxx'){
                 invoice = $scope.invoices[i];
                 break;
           }
       }
    }
}

现在,我想了解完成同样事情的最简单方法,但是使用Underscore / Lodash。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

Array#findArray#some(或他们的lodash等价物 - .find .some)一起使用。

在Array#find的每次迭代中,使用Array#some迭代发票文档,如果其中一个具有正确的类型,则Array#some返回true,而Array#find返回发票。< / p>

&#13;
&#13;
const invoices = [{ id: 1, documents: [{ type: 'document_mmmm' }] }, { id: 2, documents: [{ type: 'document_xxx1' }, { type: 'document_xxxx' }, { type: 'document_xx3x' }] }, { id: 3, documents: [{ type: 'document_zzz' }] }];

const result = invoices.find(({ documents = [] }) => 
  documents.some((d) => d.type === 'document_xxxx'));

console.log(result);
&#13;
&#13;
&#13;

使用下划线:

&#13;
&#13;
const invoices = [{ id: 1, documents: [{ type: 'document_mmmm' }] }, { id: 2, documents: [{ type: 'document_xxx1' }, { type: 'document_xxxx' }, { type: 'document_xx3x' }] }, { id: 3, documents: [{ type: 'document_zzz' }] }];

const result = _.find(invoices, ({ documents = [] }) => 
  _.some(documents, (d) => d.type === 'document_xxxx'));

console.log(result);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;