Можете ли вы создать ссылки на массив объектов в 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] )