0

我一直在用这个把头发拉出来 - 我有以下数组,继续一个对象 - 其中包含一个凭证数组(包含可能无限数量的对象)

var retailer = [ { _id: 52000c,
    address: 'bla bla bla',
    email: 'test@emailaddress',
    img: 'http://bla.jpg',
    intro: ' hello',
    strapLine: 'goodbye',
    tel: '0000 0000000',
    title: 'YE OLDE SHOPPE',
    website: 'http://',
    vouchers: 
     [ { _id: 523d003,
         barcode: false,
         description: 'blah',
         endTime: '20 December 2013',
         hidden: true,
         redemptionCode: 'redemptionCode',
         smallPrint: 'blah.',
         startTime: 'Today',
         title: 'blahbla' },
       { _id: 523de3,
         barcode: false,
         description: 'blah',
         endTime: '20 December 2013',
         hidden: true,
         redemptionCode: 'redemptionCode',
         smallPrint: 'blah.',
         startTime: 'Today',
         title: 'blahbla' },
        { _id: 523dr,
         barcode: false,
         description: 'blah',
         endTime: '20 December 2013',
         hidden: false,
         redemptionCode: 'redemptionCode',
         smallPrint: 'blah.',
         startTime: 'Today',
         title: 'blahbla' } ] 
} ]  

使用 underscore.js,我试图过滤掉那些具有隐藏属性的凭证对象(隐藏 == true) - 所以我最终得到以下内容,所以我只得到那些可见的凭证(隐藏 = =假)

var retailer = [ { _id: 52000c,
        address: 'bla bla bla',
        email: 'test@emailaddress',
        img: 'http://bla.jpg',
        intro: ' hello',
        strapLine: 'goodbye',
        tel: '0000 0000000',
        title: 'YE OLDE SHOPPE',
        website: 'http://',
        vouchers: 
         [{ _id: 523dr,
             barcode: false,
             description: 'blah',
             endTime: '20 December 2013',
             hidden: false,
             redemptionCode: 'redemptionCode',
             smallPrint: 'blah.',
             startTime: 'Today',
             title: 'blahbla' }] 
    } ]  

所以使用下划线js,我根据之前的堆栈溢出线程(Filtering array with underscore.js)编写了以下内容

var visibleVouchers = _(retailer[0].vouchers).filter(function (x) { return !x.hidden;});

这将返回所有可见的凭证 - 但是,我在此过程中失去了零售商。最好的方法是什么?我尝试了很多不同的方法——例如,尝试用新的凭证数组替换旧的凭证数组——但它似乎不起作用。

谢谢,罗伯

4

2 回答 2

2

用于_.map()零售商,这是一对一的映射。在回调(每个零售商项目)中,使用_.filter()(或_.reject(),取决于您的感觉)过滤掉凭证。

var arrRetailers = _.map(retailers, function(retailer) {
  var item = _.extend({}, retailer);
  item.vouchers = _.filter(retailer.vouchers, function(voucher) {
    return !voucher.hidden;
  }) || []; //in case of there is no "visible" voucher
  return item;
});

这将返回一个新数组,并且不会更改您的初始零售商数组。

如果您愿意_.reject(),必须相应地调整您的回调:

_.reject(retailer.vouchers, function(voucher) {
    return voucher.hidden; //note there is no exclamation mark
}) || [];

希望这可以帮助!

于 2013-09-21T12:39:46.800 回答
0

我发现了一篇博客文章http://www.untitleddesigns.com/2011/javascript-replace-array-contents/似乎回答了我的问题 - 它确实有效,虽然我不熟悉原型 - 所以不太清楚为什么它的工作。

var visibleVouchers = _(retailer[0].vouchers).filter(function (x) { return !x.hidden;});
retailer[0].vouchers.length = 0;
Array.prototype.push.apply(retailer[0].vouchers, visibleVouchers);
于 2013-09-21T12:55:42.977 回答