Можете ли вы создать ссылки на массив объектов в Javascript?

Я новичок в 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 ответа

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

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

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] )
Другие вопросы по тегам