["a,b,c", "foo,bar", "1,2,1", "a"] // should convert to → '"a,b,c","foo,bar","1,2,1","a"'
toString() или .join("") приведет к появлению нежелательных:var arr = ["a,b,c", "foo,bar", "1,2,1", "a"];
console.info( arr.toString() )
console.info( arr.join(',') )JSON.stringify:var arr = ["a,b,c", "foo,bar", "1,2,1", "a"];
var s = JSON.stringify(arr).slice(1,-1);
console.info( typeof s, ":" , s )↑ The above is the wanted result, but i'm sure there's a cleaner way of doing it
Это единственный способ преобразовать массив, содержащий строковые элементы, содержащие запятые, в строку?
Эх! У ОП 40,5к репутации. И создал очень запутанный вопрос, что это дает ?.
Аккаунт взломан или продан?
Также объясните, почему важно, чтобы строки внутри массива содержали запятые.
или просто набрал репутацию из более простого времени: stackoverflow.com/questions/2332811/capitalize-words-in-stri ng :)
Думаю, второй результат - это то, чего он действительно хотел.
Так в чем был вопрос ...?
@Chase Вы могли бы быть правы, так что, возможно, arr.map(i => `"${i}"`).join(","), но тогда как насчет экранирования, ", или это не проблема, может быть, stringifyy - лучший вариант. OP должен быть более конкретным ..
Вы можете использовать другой разделитель с join(). Просто должно быть что-то, чего нет в исходных строках.
Что ты не понимаешь в людях? Я специально спросил, как присоединить элементы массива, содержащие запятую. Я придумал способ, который я считаю взломом, и спросил, может ли быть более «формальный» способ сделать это. Я действительно не понимаю, почему все оскорбления и отрицательные голоса. очень недружелюбный, я уже много лет здесь отвечаю, модерирую и помогаю, чем могу ..
Не думаю, что вы найдете что-то лучше, чем то, что у вас уже есть с JSON.stringify(). Вы определили желаемый выходной формат, который отличается от формата JSON.stringify() только начальным и конечным символом. Это твой лучший шанс. Ничто иное, встроенное в Javascript, не делает строки похожими на необработанный строковый синтаксис Javascript (с внешними кавычками), потому что он не нужен или не используется для фактического строкового значения на языке.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот еще один способ получить тот же результат, что и с stringify (кроме случаев, когда arr содержит строки со встроенными двойными кавычками):
arr.reduce((a, c, i) => a + (i > 0 ? ',"' : '"') + c + '"', '')
Это не даст того же результата, что и stringify, если в любой из строк есть " .. :)
@Keith Отличный улов! Я добавил это предостережение к своему ответу.
Это зависит от того, что для вас значит «преобразование в строку». Массив - это упорядоченный список элементов, доступ к которым осуществляется численно. Строка - это текстовое представление этого упорядоченного списка. Если ваш вопрос: «как преобразовать массив в строку, сохранив при этом возможность вернуть исходный массив», то наиболее эффективным ответом будет JSON.stringify для преобразования массива в строку, затем JSON.parse для преобразования строка обратно в массив. Однако JSON.stringify - лишь один из многих способов преобразования массива в строку.
Простой способ объединить все строки в массиве - использовать Array.prototype.join.call или String.prototype.concat.apply.
"use strict";
(function(){
var arr = ["a,b,c", "foo,bar", "1,2,1", "a"];
console.info( "Array.prototype.join: ", arr.join("") );
console.info( "String.prototype.concat: ", String.prototype.concat.apply("", arr) );
})();Другой способ преобразовать массив в строку - просмотреть каждую строку в массиве и объединить их вместе.
"use strict";
(function(){
var arr = ["a,b,c", "foo,bar", "1,2,1", "a"];
var res = "";
var i = arr.length;
var curStr = "";
while (i--) {
curStr = arr[i];
// when the item on the left side is a string, the "+"
// operator acts as a concatination operator
res = res + curStr + ",";
// res += curStr + ","; // works just as well
// res += arr[i] + ","; // also works too
}
console.info( res );
})();Используя тот факт, что мы можем пройти по каждому элементу в массиве и рассмотреть каждую строку по отдельности, мы можем сделать что-то вроде преобразования каждой строки в blob-объект base64, а затем объединить каждую строку с разрывом строки.
"use strict";
(function(window){
var btoa = window.btoa, atob = window.atob;
function encode(theArray){
var i = theArray.length, res = "";
while (i--) res += btoa(theArray[i]) + "\n";
return res.slice(0,-1);
}
function decode(theString){
var splitted = theString.split("\n");
var i = splitted.length, res = [];
while (i--) res.push( atob(splitted[i]) );
return res;
}
var arr = ["a,b,c", "foo,bar", "1,2,1", "a"];
var encoded_arr = encode(arr);
console.info("encoded_arr: ", JSON.stringify(encoded_arr, null, 1).replace(/\\n/g, "\n") );
var decoded_arr = decode(encoded_arr);
console.info( "decoded_arr", JSON.stringify(decoded_arr, null, 1).replace(/\\n/g, "\n") );
})(self);Существует бесчисленное множество других способов объединить массив строк в зависимости от ваших конкретных потребностей. Ниже приводится множество таких примеров. Пожалуйста, подчеркните, что хотя все последующие «работают», ни один из них не так эффективен, как Array.prototype.join.
function joinWithRegexp(str1, str2) {
return str1.replace(new RegExp("$"), str2);
}
console.info(joinWithRegexp("Foo", " bar"));function joinWithPadStart(str1, str2) {
return str2.padStart(str1.length + str2.length, str1);
}
console.info(joinWithPadStart("Foo", " bar"));function joinWithPadEnd(str1, str2) {
return str1.padEnd(str1.length + str2.length, str2);
}
console.info(joinWithPadEnd("Foo", " bar"));function joinWithTemplateLiteral(str1, str2) {
return `${str1}${str2}`;
}
console.info(joinWithTemplateLiteral("Foo", " bar"));var tmpElement = document.createElement("div");
function joinWithDOM(str1, str2) {
tmpElement.appendChild(document.createTextNode(str1));
tmpElement.appendChild(document.createTextNode(str2));
return tmpElement.textContent;
}
console.info(joinWithDOM("Foo", " bar"));var reader = new FileReader;
function joinWithBlob(str1, str2, thenFunc) {
reader.onload = function(){ thenFunc( reader.result ); };
reader.readAsText(new Blob([str1, str2]));
}
joinWithBlob("Foo", " bar", function(result){
console.info(result);
});что все это .. Я не просил всего этого. В элементах (строках) массива нет запятых, и в любом случае это скорее взлом, чем мое собственное решение .. Я ищу более чистый способ, чем мой, а не наоборот
@vsync Нет более чистого способа преобразовать массив в строку, чем JSON.stringify. Однако, если бы вы могли сказать мне, какова ваша конечная цель, я мог бы сказать вам более чистое решение, чем преобразование массива в строку.
Честно говоря, я не могу объяснить это лучше, чем вопрос ... код вопроса был всем, что мне нужно, это для моего сценария, Tagify, где теги, в которых могут быть запятые, необходимо преобразовать в строку и сохранить как значение в некоторых элемент ввода
Вы не объяснили, чего хотите в результате. «Это единственный способ преобразовать массив, содержащий строковые элементы, содержащие запятые, в строку?» Нет, первые примеры, которые вы описали как «нежелательные», также конвертируют массив в строку. Кажется, вы хотите, чтобы строка была в определенном формате. Пожалуйста, объясните, что это за формат.