Текст var в json массив - PullRequest
       46

Текст var в json массив

0 голосов
/ 19 января 2020

Я пытаюсь настроить ставки для заголовка с помощью prebid. Я загружаю нужные объявления из базы данных с помощью php + mysql и создаю текстовые переменные в javascript с данными из php.

Проблема возникает, когда мне нужно создать переменную "adUnits". Если я создаю его вручную, запись напрямую работает нормально, но при создании того же контента с javascript я не получаю это работает.

Это код, который работает

var adUnits = [{
     code: '/123/468x60',
     mediaTypes: {
         banner: {
             sizes: [
                 [468, 60]
             ]
         }
     },
     bids: [{
         bidder: 'adserver',
         params: {
             networkId: 1234
         }
     }]
 }, {
     code: '/123/336x280',
     mediaTypes: {
         banner: {
             sizes: [
                 [336, 280],
                 [300, 250]
             ]
         }
     },
     bids: [{
         bidder: 'adserver',
         params: {
             networkId: 1234
         }
     }]
 }, {
     code: '/123/300x600',
     mediaTypes: {
         banner: {
             sizes: [
                 [300, 600],
                 [300, 250]
             ]
         }
     },
     bids: [{
         bidder: 'adserver',
         params: {
             networkId: 1234
         }
     }]
 }];

Это код, который не работает

var arrayadsname = adsname.split('#');//content of arrayadsname => /123/468x60#/123/336x280#/123/300x600
var arrayadssize = adssize.split('#');//content of arrayadssize => 468x60#336,280|300,250#300,600|300,250
var arraysize = '';
var ad = '';
var adUnits = [];
var preadUnits = '';

for (var i = 0; i < arrayadsname.length; i++) {  
        var arraysizeparts = arrayadssize[i].split('|');

    for (var j = 0; j < arraysizeparts.length; j++) {
                if (j == 0){
                        arraysize = '[' + arraysizeparts[j] + ']';
                }else{
                        arraysize = arraysize + ',' + '[' + arraysizeparts[j] + ']';
                }
            }

        ad = '{code: \'' + arrayadsname[i] + '\', mediaTypes: {banner: {sizes: ' + '[' + arraysize + ']' + '}}, bids: [{bidder: \'adserver\', params: {networkId: 1234}}]}';

        if (i == 0) preadUnits = ad;
        else preadUnits = preadUnits + ',' + ad;
}
//Result of ad => {code: '/123/468x60', mediaTypes: {banner: {sizes: [[468,60]]}}, bids: [{bidder: 'adserver', params: {networkId: 1234}}]},{code: '/123/336x280', mediaTypes: {banner: {sizes: [[336,280],[300,250]]}}, bids: [{bidder: 'adserver', params: {networkId: 1234}}]},{code: '/123/300x600', mediaTypes: {banner: {sizes: [[300,600],[300,250]]}}, bids: [{bidder: 'adserver', params: {networkId: 1234}}]}


adUnits = "[" + JSON.stringify(preadUnits) + "]";

Я перепробовал все возможные комбинации, объявляя переменные asUnits, такие как объект, массив, текст и используя JSON .stringify, JSON .parse также объявляя "массив" как массив и разобрать его. Я не знаю, в чем проблема.

Я вижу эту ошибку в консоли: "callee: [Исключение: TypeError: свойства 'caller', 'callee' и 'arguments' не могут быть доступны при строгом функции режима или объекты аргументов для обращения к ним в Arguments.invokeGetter "

Заранее спасибо

1 Ответ

0 голосов
/ 19 января 2020

Сначала создайте массив sizes для каждого элемента в adssize - например, превратите '300,600|300,250' в [[300, 600], [300, 250]]. Затем вы можете создать объект adUnits, сопоставив коды (разделенные на #) и получив доступ к соответствующему индексу только что созданного массива sizes:

const codes = '/123/468x60#/123/336x280#/123/300x600'.split('#');
const sizes = '468x60#336,280|300,250#300,600|300,250'
  .split('#')
  .map(
    // str is something like: '300,600|300,250'
    str => str.split('|').map(
      // substr is something like: '300,600'
      substr => substr.split(/[,x]/).map(Number)
    )
  );

const adUnits = codes.map((code, i) => ({
  code,
  mediaTypes: {
    banner: {
      sizes: sizes[i]
    }
  },
  bids: [{
     bidder: 'adserver',
     params: {
         networkId: 1234
     }
  }]
}));
console.log(adUnits);

Если это должен быть JSON, а не объект, то JSON.stringify впоследствии (никогда не пытайтесь вручную создать JSON):

const codes = '/123/468x60#/123/336x280#/123/300x600'.split('#');
const sizes = '468x60#336,280|300,250#300,600|300,250'
  .split('#')
  .map(
    // str is something like: '300,600|300,250'
    str => str.split('|').map(
      // substr is something like: '300,600'
      substr => substr.split(/[,x]/).map(Number)
    )
  );

const adUnits = codes.map((code, i) => ({
  code,
  mediaTypes: {
    banner: {
      sizes: sizes[i]
    }
  },
  bids: [{
     bidder: 'adserver',
     params: {
         networkId: 1234
     }
  }]
}));
console.log(JSON.stringify(adUnits, null, 2));
...