const arr = [
{
"id": "753311",
"role": "System Of Record (SOR)",
"license": "Target",
"DC": "Client · L2 (Inactive), Account · L1",
"managedGeography": "North America · L2, International · L2",
"managedSegment": "Institutional Clients Group [L3], Discontinued Ops [L2]",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752872",
"role": "Authorized Redistributor (AR)",
"license": "Interim",
"DC": "Holding · L1, Document · L1, Compliance · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752583",
"role": "Authorized Redistributor (AR)",
"license": "Target",
"DC": "Agreement · L1, Asset · L1, Activity · L1, Account · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified"
}
]
let adsList = arr.map(selectedObj => {
if (selectedObj.checked) {
return selectedObj.role + ", " + selectedObj.license + ", " + selectedObj.DC + ", " + selectedObj.managedGeography + ", " + selectedObj.managedSegment + ";\n"
} else {
return '';
}
}).filter((str) => str.length !== 0).join('\n');
console.info(adsList) Привет, у меня есть массив, и я в основном возвращаю строку, если объект содержит проверенное свойство и разделяет их точкой с запятой, но нужно удалить для последнего.
Я не уверен, как удалить последнюю точку с запятой после unspecified из вывода в этом случае, любые отведения были бы очень полезны.



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


Вы можете использовать метод slice() для удаления последнего символа из результирующей строки:
let adsList = arr.map(selectedObj => {
if (selectedObj.checked) {
return selectedObj.role + ", " + selectedObj.license + ", " + selectedObj.DC + ", " + selectedObj.managedGeography + ", " + selectedObj.managedSegment + ";\n"
}
return '';
}).filter((str) => str.length !== 0).join('\n').slice(0, -2);
console.info(adsList)
Вы можете использовать следующее регулярное выражение:
/;(\s|\\n)*$/
Чтобы найти точку с запятой в конце строки, замените ее пустой строкой.
Регулярное выражение имеет следующий смысл:
; соответствует буквальной точке с запятой
(\s|\\n)* соответствует одному или нескольким пробелам или \n литералам
$ соответствует концу строки
const arr = [
{
"id": "753311",
"role": "System Of Record (SOR)",
"license": "Target",
"DC": "Client · L2 (Inactive), Account · L1",
"managedGeography": "North America · L2, International · L2",
"managedSegment": "Institutional Clients Group [L3], Discontinued Ops [L2]",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752872",
"role": "Authorized Redistributor (AR)",
"license": "Interim",
"DC": "Holding · L1, Document · L1, Compliance · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752583",
"role": "Authorized Redistributor (AR)",
"license": "Target",
"DC": "Agreement · L1, Asset · L1, Activity · L1, Account · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified"
}
]
let adsList = arr.map(selectedObj => {
if (selectedObj.checked) {
return selectedObj.role + ", " + selectedObj.license + ", " + selectedObj.DC + ", " + selectedObj.managedGeography + ", " + selectedObj.managedSegment + ";\n"
} else {
return '';
}
}).filter((str) => str.length !== 0).join('\n').replace(/;(\s|\\n)*$/, '');
console.info(adsList) Вы можете обновить код, чтобы присоединиться к массиву с помощью ;\n, и если вы хотите сохранить дополнительную строку между ними, то ;\n\n
let adsList = arr.map(selectedObj => {
if (selectedObj.checked) {
return selectedObj.role + ", " + selectedObj.license + ", " + selectedObj.DC + ", " + selectedObj.managedGeography + ", " + selectedObj.managedSegment;
} else {
return '';
}
}).filter((str) => str.length > 0).join(';\n');
const arr = [{
"id": "753311",
"role": "System Of Record (SOR)",
"license": "Target",
"DC": "Client · L2 (Inactive), Account · L1",
"managedGeography": "North America · L2, International · L2",
"managedSegment": "Institutional Clients Group [L3], Discontinued Ops [L2]",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752872",
"role": "Authorized Redistributor (AR)",
"license": "Interim",
"DC": "Holding · L1, Document · L1, Compliance · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752583",
"role": "Authorized Redistributor (AR)",
"license": "Target",
"DC": "Agreement · L1, Asset · L1, Activity · L1, Account · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified"
}
]
let adsList = arr.map(selectedObj => {
if (selectedObj.checked) {
return selectedObj.role + ", " + selectedObj.license + ", " + selectedObj.DC + ", " + selectedObj.managedGeography + ", " + selectedObj.managedSegment;
} else {
return '';
}
}).filter((str) => str.length > 0).join(';\n\n');
console.info(adsList)Не добавляйте точку с запятой в вызове map, но используйте ее в качестве разделителя в последнем вызове join.
Не проблема, но:
Boolean в качестве функции обратного вызова фильтра.'', вы можете вернуть .checked, когда оно ложно, что позволяет вам вернуть одно выражение без if..else.const arr = [{"id": "753311","role": "System Of Record (SOR)","license": "Target","DC": "Client · L2 (Inactive), Account · L1","managedGeography": "North America · L2, International · L2","managedSegment": "Institutional Clients Group [L3], Discontinued Ops [L2]","checked": true,"checkBoxPatched": true},{"id": "752872","role": "Authorized Redistributor (AR)","license": "Interim","DC": "Holding · L1, Document · L1, Compliance · L1","managedGeography": "Unspecified","managedSegment": "Unspecified","checked": true,"checkBoxPatched": true},{"id": "752583","role": "Authorized Redistributor (AR)","license": "Target","DC": "Agreement · L1, Asset · L1, Activity · L1, Account · L1","managedGeography": "Unspecified", "managedSegment": "Unspecified"}];
let adsList = arr.map(obj =>
obj.checked && `${obj.role}, ${obj.license}, ${obj.DC}, ${obj.managedGeography}, ${obj.managedSegment}`
).filter(Boolean).join(';\n\n');
console.info(adsList)map + filter зацикливает массив два раза, когда только один.
@spikef На самом деле это не большая проблема, если не повторять очень большой набор данных.
Вы можете использовать reduce, но не map + filter + join вот так:
Таким образом, вам просто нужно зациклить массив один раз.
function handle(arr) {
return arr.reduce((str, selectedObj) => {
if (!selectedObj.checked) return str;
const row = `${selectedObj.role}, ${selectedObj.license}, ${selectedObj.DC}, ${selectedObj.managedGeography}, ${selectedObj.managedSegment}`;
return str ? str + ';\n\n' + row : row;
}, '');
}
const arr = [{
"id": "753311",
"role": "System Of Record (SOR)",
"license": "Target",
"DC": "Client · L2 (Inactive), Account · L1",
"managedGeography": "North America · L2, International · L2",
"managedSegment": "Institutional Clients Group [L3], Discontinued Ops [L2]",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752872",
"role": "Authorized Redistributor (AR)",
"license": "Interim",
"DC": "Holding · L1, Document · L1, Compliance · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified",
"checked": true,
"checkBoxPatched": true
},
{
"id": "752583",
"role": "Authorized Redistributor (AR)",
"license": "Target",
"DC": "Agreement · L1, Asset · L1, Activity · L1, Account · L1",
"managedGeography": "Unspecified",
"managedSegment": "Unspecified"
}
]
const adsList = handle(arr);
console.info(adsList)
вам больше не нужно и возвращайтесь, возврата достаточно