Javascript преобразовать массив с нулевым значением в строку

#javascript

#javascript

Вопрос:

У меня есть массив

 localCostp:
  0:null
  1:null
  2:0.5
  3:null
  4:null
  5:null
  6:0.5
  7:null
  8:null
  

и я хотел бы преобразовать его в строку, подобную приведенной ниже

 "[],[],[0.5],[],[],[],[0.5],[],[]"
  

я попробовал нижеприведенное

 console.log("["   Object.values(localCostp).join("],[")   "]");
  

но я теряю нулевое значение

 "[0.5],[0.5]"
  

я заполняю массив приведенным ниже кодом

     Array.prototype.shuffle = function() {
       var r=[],c = this.slice(0);
        for (let i = c.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i   1));
            [c[i], c[j]] = [c[j], c[i]];
        }
        return c;
    }; 

    Array.prototype.populateUnique = function(n) {
    return Object.keys( Object( 0 Array(n) ) );
    };

    var getRandomInts = function(num, min, max) {
        var a = [].populateUnique(max 1).slice(min);
        a = a.shuffle();
        return a.slice(0,num);
    };

    BordsIdtoFill  = getRandomInts(NumOfBoardToFill,1,6);

       switch(retrivePanelsPanelsbetType(configGenerateData.panelsBetType)) {
    case 1: case 2:{   
        gameMultiplayer      = 1;
    } break;
    case 3: case 4 : case 5: {
       gameMultiplayer      = 2;    
    } break;
    case 6:  {            
        gameMultiplayer      = 2;
    } break;
}
  

var localCostp = новый массив(9);

     BordsIdtoFill.forEach(function(Bord) {
      localCostp[Bord]= (1*gameMultiplayer * 0.5)
    });

console.log("["   Object.values(localCostp).join("],[")   "]");
  

не все позиции массива заполнены

Комментарии:

1. «я пробовал следующее», это работает для меня .

Ответ №1:

Наивный способ сделать это заключался бы в

 const arr = [null, null, 0.5, null, 0.5]

const processedArr = arr.map(element => {
  if (element) {
    return [element];
  } else {
    return [];
  }
});

const result = JSON.stringify(processedArr);
console.log(result)  

Более короткий, но менее читаемый способ сделать это будет заключаться в использовании следующего:

 const arr = [null, null, 0.5, null, 0.5];
const result = `[[${arr.join('],[')}]]`;
console.log(result);  

Комментарии:

1. если я использую ваш код с инициализацией вашего массива, все работает правильно, но если я инициализирую и заполняю массив программно, я принимаю значение ниже null,[0.5],[0.5],[0.5],[0.5],[0.5],[0.5], null,null я заполняю массив приведенным ниже кодом var localCostp = new Array(9); BordsIdtoFill.forEach(функция(Bord) { localCostp[Bord]= (1* gameMultiplayer * 0.5) }); не все позиции массива заполнены

2. Извините, ermm.. Позвольте мне попробовать и запустить предоставленный вами код. Между тем, я предоставил альтернативное решение, которое короче, быстрее, но менее читабельно.

3. является gameMultiplayer любым целым числом?

Ответ №2:

Это интересный результат. 🙂

В комментарии вы сказали:

я заполняю массив приведенным ниже кодом

 var localCostp = new Array(9);
BordsIdtoFill.forEach(function(Bord) {
    localCostp[Bord] = (1*gameMultiplayer * 0.5);
});
  

не все позиции массива заполнены

Это очень отличается от массива, который вы показали. В показанном вами массиве были null s. В этом массиве есть пробелы. Когда вы считываете значение разрыва, вы получаете ответ undefined (не null ).

Чтобы сделать это, вам нужно либо использовать простой for цикл, for-of петлю или какой-либо другой способ использования iterable from values (который включает пробелы), либо сначала заполнить пробелы.

Например, при этом используется итерируемый из values :

 const string = [...localCostp.values()].map(entry => JSON.stringify(entry === undefined ? [] : [entry])).join();
  

Живой пример:

 const localCostp = new Array(9);
localCostp[2] = 0.5;
localCostp[6] = 0.5;

const string = [...localCostp.values()].map(entry => JSON.stringify(entry === undefined ? [] : [entry])).join();
console.log(string);  

В другом комментарии вы сказали:

если я запускаю ваш код в своей среде, я предполагаю, что произошла ошибка при оценке сценария предварительного запроса: TypeError: localCostp.values(…)[Symbol.iterator] не является функцией

Это удивительно, values был добавлен в ES2015, тот же символ времени.итератор и распространение массива были, но из-за вашего сообщения об ошибке кажется, что у вас есть последнее, но не первое. Я подозреваю, что вы переносите и пропускаете полизаполнение.

Вот версия ES5 (не может использовать map , потому что она не будет посещать пробелы):

 var result = [];
for (var i = 0; i < localCostp.length;   i) {
    var entry = localCostp[i];
    result[i] = JSON.stringify(entry === undefined ? [] : [entry]);
}
result = result.join();
  

Живой пример:

 var localCostp = new Array(9);
localCostp[2] = 0.5;
localCostp[6] = 0.5;

var result = [];
for (var i = 0; i < localCostp.length;   i) {
    var entry = localCostp[i];
    result[i] = JSON.stringify(entry === undefined ? [] : [entry]);
}
result = result.join();

console.log(result);  

Комментарии:

1. если я использую ваш код с инициализацией вашего массива, все работает правильно, но если я инициализирую и заполняю массив программно, я принимаю значение ниже null,[0.5],[0.5],[0.5],[0.5],[0.5],[0.5], null,null я заполняю массив приведенным ниже кодом var localCostp = new Array(9); BordsIdtoFill.forEach(функция(Bord) { localCostp[Bord]= (1* gameMultiplayer * 0.5) }); не все позиции массива заполнены

2. @LucaRuggeri — Это не массив с null s, это массив с пробелами . Чтение разрыва дает вам значение undefined (не null ). Почему бы просто не показать нам, как вы его создавали в первую очередь?

3. отредактируйте мой пост с помощью кода, который создает и заполняет массив

4. извините, но когда я утешаю. регистрирует массив, я принимаю нулевое значение, которое …. если я запускаю ваш код в своей среде, я понимаю, что произошла ошибка при оценке сценария предварительного запроса: TypeError: localCostp.values(…)[Symbol.iterator] не является функцией

5. @LucaRuggeri — Это удивительно, values был добавлен в ES2015 в то же время, что и символ времени.iterator был, но из-за вашего сообщения об ошибке кажется, что у вас есть последнее, но не первое. Вы используете транспилирование и пропускаете полизаполнение? Я добавлю решение ES5.

Ответ №3:

Вы можете просто использовать Array#map для получения значения [] for null или заключить число в квадратные скобки, чтобы затем Array#join получить желаемый результат:

 let arr = [
  null,
  null,
  0.5,
  null,
  null,
  null,
  0.5,
  null,
  null
]

let str = arr
  .map(item => item === null ? "[]" : `[${item}]`)
  .join();

console.log(str);  

Комментарии:

1. если я использую ваш код с инициализацией вашего массива, все работает правильно, но если я инициализирую и заполняю массив программно, я принимаю значение ниже null,[0.5],[0.5],[0.5],[0.5],[0.5],[0.5], null,null я заполняю массив приведенным ниже кодом var localCostp = new Array(9); BordsIdtoFill.forEach(функция(Bord) { localCostp[Bord]= (1* gameMultiplayer * 0.5) }); не все позиции массива заполнены

Ответ №4:

Вы могли бы сопоставить значения в массиве или нет и упорядочить данные и получить строку между внешними скобками.

 var data = [null, null, 0.5, null, null, null, 0.5, null, null],
    result = JSON.stringify(data.map(v => v === null ? [] : [v])).slice(1, -1);

console.log(result);  

Пример со строками шаблона.

 var data = [null, null, 0.5, null, null, null, 0.5, null, null],
    result = data.map(v => `[${v === null ? '' : v}]`).join();

console.log(result);  

С помощью массива с разреженными элементами.

 var array = [, , 0.5, , , , 0.5, , ],
    result = Array.from(array, (v = '') => `[${v}]`).join();

console.log(result);  

Комментарии:

1. если я использую ваш код с инициализацией вашего массива, все работает правильно, но если я инициализирую и заполняю массив программно, я принимаю значение ниже null,[0.5],[0.5],[0.5],[0.5],[0.5],[0.5], null,null я заполняю массив приведенным ниже кодом var localCostp = new Array(9); BordsIdtoFill.forEach(функция(Bord) { localCostp[Bord]= (1* gameMultiplayer * 0.5) }); не все позиции массива заполнены