Превратить массив в строку, отдельную строку с разделителем - JavaScript - PullRequest
2 голосов
/ 02 апреля 2019

Определите функцию, myJoin, которая принимает до двух аргументов:

  1. array
  2. separator (строка, необязательно)

myJoin должен вернуть строку со всеми элементами из массива, соединенными вместе.Разделитель должен разделять соединенные элементы:

myJoin(['a', 'b', 'c'], '+'); // => "a+b+c"

Если разделитель не определен, используйте ',' в качестве разделителя по умолчанию.

myJoin(['Peter', 'Paul', 'Mary']); // => "Peter,Paul,Mary"

Если какие-либо элементы в массиве имеют значение undefinedили null, они должны быть заменены пустой строкой в ​​возвращаемой строке.

myJoin(['hello', undefined, 'world'], '-'); // => "hello--world"

Я не могу использовать встроенный метод join.

Ссылка на codepen для тестирования

До сих пор я пробовал:

function myJoin (array, separator) {

  let newString = "";

  if (separator = undefined) {
    separator === ",";
  }

  else {

    for (let i = 0; i < array.length; i++) {
      newString = i + separator;
    }

  }

  newString = array.toString();

  return newString;

}

console.log(myJoin(['a', 'b', 'c'], '+'));

^ Это не объединение элементов строки вместе с разделителем,и на самом деле возвращает a,b,c дважды.Любая идея, почему?

EDIT : первое обновление кода после предложений @Jonas Wilms:

function myJoin (array, separator) {

  let newString = "";

  if (separator === undefined) {
    separator === ",";
  }

  for (let i = 0; i < array.length; i++) {
    newString += array[i] + separator;
  }

  return newString;

}

Кажется, это работает в моей консоли VS Code, но нев CodePen.

Ответы [ 6 ]

4 голосов
/ 02 апреля 2019

попробуй

array.reduce( (s,x,i) => s+(i>0 ? separator : '') + (x==null ? '' : x), '') 

function myJoin(array, separator=',') { 
  return array.reduce( (s,x,i) => s+(i>0 ? separator : '') + (x==null ? '' : x), '') 
}

console.log( myJoin(['a', 'b', 'c'], '+') ); 
console.log( myJoin(['Peter', 'Paul', 'Mary']) );
console.log( myJoin(['hello', undefined, 'world'], '-') );
2 голосов
/ 02 апреля 2019

Использовать синтаксис по умолчанию для установки разделителя || forEach принимает value, index, array Тест на последний элемент.

function myJoin (array, separator) {
  let newString = "";
  separator = separator||','; 
  
  array.forEach((a,i,arr) => {
    newString += `${a}${(i < arr.length-1) ? separator : ''}`;
  });
  return newString;
}

console.log(myJoin(['a', 'b', 'c'], '+'));
console.log(myJoin(['a', 'b', 'c']));
console.log(myJoin(['a', 'b', 'c'], '-'));
2 голосов
/ 02 апреля 2019

function myJoin(array, separator=',') {
  let str = '';
  for (let i = 0; i < array.length; i++) {
    if (array[i] !== null && array[i] !== undefined)
      str += array[i];
    if (i < array.length - 1)
      str += separator;
  }

  return str;
}

console.log(myJoin(['a','b','c']));
console.log(myJoin(['a','b','c'], '+'));
console.log(myJoin(['a',null,'c'], '-'));
console.log(myJoin(['a','b',undefined], '.'));
2 голосов
/ 02 апреля 2019

Используйте map и forEach со строкой шаблона, например:

function myJoin(arr, sep = ",") {
  arr = arr.map(e => [undefined, null].includes(e) ? "" : e);
  var result = "";
  arr.forEach((e, i) => result += `${i ? sep : ""}${e}`);
  return result;
}

console.log(myJoin(['Peter', undefined, 'Paul', null, 'Mary', 'Jack'], "-"));

Синтаксис ES5:

function myJoin(arr, sep) {
  sep = sep || ",";
  arr = arr.map(function(e) {
    return [undefined, null].includes(e) ? "" : e;
  });
  var result = "";
  arr.forEach(function(e, i) {
    result += (i ? sep : "") + e;
  });
  return result;
}

console.log(myJoin(['Peter', undefined, 'Paul', null, 'Mary', 'Jack'], "-"));
2 голосов
/ 02 апреля 2019

Несколько подсказок:

  • Не путайте операторы присваивания (=) и сравнения (===).if(a = b) является ошибкой в ​​99% случаев.

  • array.toString() вызывает array.join() внутренне, я бы посчитал это обманом, также я не уверен, чтовы хотите добиться этого (я имею в виду, что newString должен уже содержать желаемый результат, если вы делаете цикл правильно, не так ли?)

  • i - это индекс вваши array, чтобы получить значение в этой позиции, используйте array[i].

  • Я не думаю, что ваш цикл должен быть в ветви else {, Я не думаю, что вам нужно else вообще (как вы всегда хотите присоединиться к массиву, циклически над ним).

  • с newString = you переназначить newString и потеря предыдущего значения, вы можете использовать от newString += до и добавить значение к нему.

1 голос
/ 02 апреля 2019

Вы можете использовать Array.reduce(), чтобы присоединиться к вашему массиву.

let arr = ['a', 'b', undefined, 'c', 'd', null, 'e'];

myJoin = (arr, separator = ',') =>
  arr.reduce((acc, val, i) =>
    acc + ([undefined, null].indexOf(val) >= 0 ? '' : val) +
    (i < arr.length - 1 ? separator : ''), "");

console.log('myJoin(arr): ', myJoin(arr));
console.log('myJoin(arr, "+"): ', myJoin(arr, '+'));
console.log('arr.join("+"): ', arr.join('+'));

Надеюсь, это поможет,

...