Можете ли вы создать ссылки на массив объектов в Javascript? - PullRequest
0 голосов
/ 02 июля 2019

Я новичок в 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 голосов
/ 02 июля 2019

Мне не совсем понятно, чего вы хотите. Ниже мое лучшее предположение. Мы централизуем список предложений и функцию для получения списка из них по названию. Тогда основной код может просто вызывать эту функцию везде, где это необходимо.

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] )
0 голосов
/ 02 июля 2019

Вы можете один и тот же массив. То, где вы используете их в качестве аргумента или изменяете напрямую, это происходит по ссылке. Это означает, что исходный массив изменится.

...