Функция соединения в JavaScript с разделителем, который не отображается в конце для массивов с неизвестным количеством элементов - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в JavaScript и столкнулся с небольшой проблемой при использовании функции соединения.У меня есть массив с неизвестным количеством элементов, и я хочу напечатать его с разделителями между каждыми двумя элементами, используя соединение.Я хочу получить что-то вроде этого: a/b/c/d с '/' в качестве разделителя.Проблема в том, что в конце я получаю последний разделитель, например: a/b/c/d/.Как мне от этого избавиться?
Вот мой код:

var makePath;

function makePath(separator) {
  let comp = []
  return function(element) {
    comp.push(element)
    return comp.join(separator)
  }
}

var main = function() {
  var p1 = makePath("/");
  p1("One");
  p1("Two");
  p1("Three");

  window.console.log("p1:" + p1());
}

main()

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Это происходит потому, что когда вы вызываете p1() без аргумента, вы фактически выполняете p1(undefined).Поэтому ваш массив выглядит следующим образом: ["One", "Two", "Three", undefined] и объединяется как One/Two/Three/

Демонстрация:

var makePath;

function makePath(separator) {
  let comp = []
  return function(element) {
    console.log(`pushing "${element}" to array`)
    comp.push(element)
    return comp.join(separator)
  }
}

var main = function() {
  var p1 = makePath("/");
  p1("One");
  p1("Two");
  p1("Three");

  window.console.log("p1:" + p1());
}

main()

Решение: если аргумент не передан, не помещайте его в массив:

var makePath;

function makePath(separator) {
  let comp = []
  return function(element) {
    if(element) comp.push(element)
    return comp.join(separator)
  }
}

var main = function() {
  var p1 = makePath("/");
  p1("One");
  p1("Two");
  p1("Three");

  window.console.log("p1:" + p1());
}

main()
0 голосов
/ 24 октября 2018

просто добавьте .replace, который удалит последние / с этим регулярным выражением /\/$/

var makePath;
function makePath(separator)
{   
  let comp = []
  return function(element)
  {
    comp.push(element)
    return comp.join(separator).replace(/\/$/,"")
  }
}




var main = function()   
{
var p1 = makePath("/");
p1("One"); 
p1("Two"); 
p1("Three");

window.console.log("p1:" + p1() );
}
main();
0 голосов
/ 24 октября 2018

Почему бы не проверить только параметр undefined?и таким образом вы выполняете функцию join только тогда, когда вам нужно построить строку.

function makePath(separator) {
  let comp = []
  return function(element) {
    if (element) comp.push(element);    
    return comp.join(separator);
  }
}

var main = function() {
  let pathify = makePath("/");
  pathify("One");
  pathify("Two");
  pathify("Three");

  window.console.log("Path:", pathify());
}

main()
0 голосов
/ 24 октября 2018

в вашем выражении console.log вы вызываете p1() с пустым аргументом.Это то, что добавляет конечный разделитель к вашей строке.Вы хотите сохранить результат последнего вызова и использовать его вместо этого.

var makePath;
function makePath(separator)
{   
  let comp = []
  return function(element)
  {
    comp.push(element)
    return comp.join(separator)
  }
}




var main = function()   
{
var p1 = makePath("/");
p1("One"); 
p1("Two"); 
var x = p1("Three");//store the result of p1('three')

window.console.log("p1:" + x );//print it out
}
main();
...