Javascript удалить точку с запятой из последней строки

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 из вывода в этом случае, любые отведения были бы очень полезны.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
90
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать метод 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)

вам больше не нужно и возвращайтесь, возврата достаточно

EugenSunic 03.05.2023 11:30

Вы можете использовать следующее регулярное выражение:

/;(\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 02.06.2023 13:05

@spikef На самом деле это не большая проблема, если не повторять очень большой набор данных.

I0_ol 02.06.2023 13:14

Вы можете использовать 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)

Другие вопросы по теме