您可以在Javascript中创建对对象数组的引用吗?

时间:2019-07-02 13:39:29

标签: javascript prebid.js header-bidding

我一般都不熟悉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个不同的数组集。因此,我需要能够分别引用它们。

2 个答案:

答案 0 :(得分:0)

您可以使用同一阵列。 当您将它们用作传递参数或直接修改的地方时,它通过引用发生。 这意味着原始数组将发生变化。

答案 1 :(得分:0)

我不清楚您想要什么。以下是我的最佳猜测。我们集中投标清单和一个按名称检索投标清单的函数。然后,主代码可以在需要的地方调用该函数。

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] )