Можете ли вы создать ссылки на массив объектов в 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 различных наборов массивов. Поэтому мне нужно иметь возможность ссылаться на них отдельно.


person Phaneron    schedule 02.07.2019    source источник
comment
как поменять предметы внутри? Можете ли вы предоставить пример того же блока кода, на который вы ссылаетесь?   -  person Nina Scholz    schedule 02.07.2019
comment
var bids = adUnits[0].bids - теперь ставки можно использовать в любом месте вашего кода. Это то, что вы имели в виду?   -  person mplungjan    schedule 02.07.2019
comment
Изменения внутри ограничиваются добавлением новых участников торгов (bidder6, bidder7 и т. д. со своими параметрами), то есть количество объектов в массиве может увеличиваться. Возможно, порядок участников торгов также может измениться, поэтому решение, не основанное на индексации, было бы отличным решением. Еще одно замечание, у нас на скрипте около 20+ рекламных блоков, многие из них имеют одинаковые массивы объектов (бидеры и их параметры), но некоторые рекламные блоки имеют немного разные массивы (значения параметров разные). Всего мне нужно иметь возможность повторно использовать в скрипте 4-5 различных наборов массивов.   -  person Phaneron    schedule 02.07.2019


Ответы (2)


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

person Rahul Rana    schedule 02.07.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] )
person Scott Sauyet    schedule 02.07.2019