#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) }); не все позиции массива заполнены