【问题标题】:Can you create references to an array of objects in Javascript?您可以在 Javascript 中创建对对象数组的引用吗?
【发布时间】:2019-07-02 13:39:29
【问题描述】:

我是 Javascript 和一般编码的新手,所以如果这个问题很愚蠢,请原谅我。我想知道是否可以重用或引用一段代码,特别是一组对象。目前,完全相同的代码块使用了 8-10 次,并且需要定期更新代码块,这意味着我们必须更新同一代码块 8-10 次。如果有一种方法可以定义代码块以便它可以被引用/重用,并且对这个代码块的更改将在整个引用中镜像,那么脚本不仅会变得更容易管理,而且它也将变成原来大小的一半。

脚本用于通过预出价和标头出价进行广告投放(如果有的话)。基本上,设置是一个包含广告单元的数组,每个广告单元都包含一个标识符代码、允许的尺寸格式和一组投标人。我想重用它的这一系列投标人。我将在下面提供一个广告单元(匿名)的当前代码示例。

到目前为止,我还没有成功地在网上找到任何解决方案。

var adUnits = [
    {
        code: "0000001",
        sizes: [[980, 300], [980, 150]],
// The code below is what I want to reuse
        bids: [
        {
            bidder: "bidder1",
                params: { 
                    mid: 000001,
                    adxDomain: 'adx.domainhere.net'
                }
        },{
            bidder: "bidder2",
                params: { 
                    accountId: '00002',
                    siteId: '00002',
                    zoneId: '000002'
                }
        },{
            bidder: "bidder3",
                params: { 
                    mid: 000003,
                    adxDomain: 'adx.domeinhere.net'
                }
        },{
            bidder: 'bidder4',
                params: {
                    placementId: '00000004'
                }
        },{
            bidder: 'bidder5',
                params: {
                    placementId: '00000005',
                    keywords: {
                        'no-sno-publishergroup': ['nameIdentifier']
                              },
                    user: {
                        externalUid: getAdId()
                          }
                }
    }]

谁能指出我正确的方向?

编辑:

内部的更改仅限于添加新的投标者(bidder6、bidder7 等具有自己的参数),这意味着数组中的对象数量可能会增加。可能,投标人的顺序也可能发生变化,因此不依赖索引的解决方案会很棒。

另外请注意,我们的脚本中有大约 20 多个广告单元,其中许多具有相同的对象数组(出价者及其参数),但有些广告单元的数组略有不同(参数的值不同)。我需要能够在脚本中重用总共 4-5 组不同的数组。所以我需要能够分别参考这些。

【问题讨论】:

  • 你如何改变里面的项目?你能提供一个相同代码块的例子吗?
  • var bids = adUnits[0].bids - 现在可以在代码中的任何位置使用出价。你是这个意思吗?
  • 内部的变化仅限于添加新的bidder(bidder6、bidder7等,带有自己的参数),这意味着数组中的对象数量可能会增加。可能,投标人的顺序也可能发生变化,因此不依赖索引的解决方案会很棒。另请注意,我们在一个脚本中有大约 20 多个广告单元,其中许多具有相同的对象数组(出价者及其参数),但有些广告单元的数组略有不同(参数的值不同)。我需要能够在脚本中重用总共 4-5 组不同的数组。

标签: javascript prebid.js header-bidding


【解决方案1】:

你可以同一个数组。 当您将它们用作传入参数或直接修改时,它是通过引用发生的。 这意味着原来的数组会改变。

【讨论】:

    【解决方案2】:

    我并不完全清楚你想要什么。下面是我最好的猜测。我们集中了出价列表和一个按名称检索出价列表的函数。然后主代码可以在需要的地方调用该函数。

    const getAdId = ((n) => () => n++)(0) // dummy
    
    //  `allBids` and `getBids` need to be in some central location
    
    const allBids = {
        bidder1: {
           mid: '000001',
           adxDomain: 'adx.domainhere.net'
        },
        bidder2: {
           accountId: '00002',
           siteId: '00002',
           zoneId: '000002'
        },
        bidder3: {
            mid: '000003',
            adxDomain: 'adx.domeinhere.net'
        },
        bidder4: {
           placementId: '00000004'
        },
        bidder5: {
           placementId: '00000005',
           keywords: {
              'no-sno-publishergroup': ['nameIdentifier']
           },
           user: {
              externalUid: getAdId()
           }
       }
       // all other bids here.
    }
    
    const getBids = (names) => names .map (name => ({
        bidder: name,
        params: allBids [name] || {}
    }))
    
    
    // This needs to have a reference to `getBids`, via an `import`, `require` or whatever mechanism you choose.
    
    var adUnits = [{
        code: "0000001",
        sizes: [[980, 300], [980, 150]],
        // Now you can just pick the bids you want from the list
        bids: getBids(["bidder1", "bidder2", "bidder3", "bidder4", "bidder5"])
    }]
    
    console .log (
      adUnits
    )
    
    // somewhere else
    // ... getBids(['bidder3', 'bidder7', 'bidder2', 'bidder6']) 

    这里的参数列表在所有调用者之间通过引用共享,但整个投标者对象不是。要么很容易改变。要停止通过引用共享,您可以这样做

    const getBids = (names) => names .map (name => ({
        bidder: name,
        params: clone(allBids [name] || {})
    }))
    

    带有一些合适的clone 实现。

    如果要共享整个对象,只需将其存储在主对象中即可:

    const allBids = {
        bidder1: {
            bidder: 'bidder1`,
            params: {
               mid: '000001',
               adxDomain: 'adx.domainhere.net'
            }
        }
        /* ... */
    }
    

    并将getBids 函数更改为

    const getBids = (names) => names .map (name => allBids [name] )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 2021-02-17
      相关资源
      最近更新 更多