Javascript пытается отформатировать строку имен - PullRequest
0 голосов
/ 19 февраля 2019

пытается вывести:

list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ])
// returns 'Bart, Lisa & Maggie'

list([ {name: 'Bart'}, {name: 'Lisa'} ])
// returns 'Bart & Lisa'

list([ {name: 'Bart'} ])
// returns 'Bart'

list([])
// returns ''

Мой код:

function list(names){
  let output = "";
  let length = names.length;
  for(i=0; i < length; i++){
    if(length > 2 && i !== length - 1){
     output += names[i]['name'] + ', ' ;
    }
    else if( i == length - 1 && i !== 0) {
      output += ' & ' + names[i]['name'] ;
    } else{
      output += names[i]['name'];
    }
  }
  return output;
}

Ожидается: «Барт, Лиза, Мэгги, Гомер и Мардж», вместо этого получил: «Барт, Лиза,Мэгги, Гомер и Мардж '

Есть идеи, почему оператор if работает неправильно?Я не могу заставить его работать.

Ответы [ 5 ]

0 голосов
/ 19 февраля 2019
function list(names) {
    const length = names.length;
    return names.reduce((acc, val, idx) => {
        if(idx === 0) {
            return val.name;
        }
        return acc + ((idx === length - 1) ? ' & ' : ', ') + val.name;
    }, '');
}

То, что вы пытаетесь сделать, - это преобразовать коллекцию в одно значение.Вы столкнетесь со многими сценариями для различных типов объектов.Следовательно, javascript обеспечил сокращение функциональности для преобразования вашей коллекции массивов в одно накопленное значение.вам даже не нужен отдельный метод list для решения этой проблемы.Метод Reduce аккуратен, не требует пояснений для новых разработчиков и является одним из лучших способов решения таких проблем.

см .: https://medium.freecodecamp.org/reduce-f47a7da511a9

0 голосов
/ 19 февраля 2019

Другой ответ правильный, но он просто указывает на то, что есть несколько методов-прототипов Array, которые могут помочь вам, даже не занимаясь индексацией вручную:

function list (names) {
  const first = names.map(it => it.name)
  const last = first.pop()
  return [ first.join(', '), last ].filter(Boolean).join(' & ')
}
0 голосов
/ 19 февраля 2019

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

function list(names) {
  let output = "";
  const length = names.length;
  for (i = 0; i < length; i++) {
    if (i > 0) {
      output += i < length - 1 ? ', ' : ' & ';
    }

    output += names[i].name;
  }
  return output;
}

console.log(list([{ name: 'Bart' }, { name: 'Lisa' }, { name: 'Maggie' }])); // returns 'Bart, Lisa & Maggie'

console.log(list([{ name: 'Bart' }, { name: 'Lisa' }])); // returns 'Bart & Lisa'

console.log(list([{ name: 'Bart' }])); // returns 'Bart'

console.log(list([])); // returns ''

Вы также можете использовать Array.map() и Array.join() с той же логикой:

const addSeparator = (isNotLast) => isNotLast ? ', ' : ' & ';

const list = (names) => 
  names.map(({ name }, i) => i > 0 ? 
    `${addSeparator(i < length - 1)}${name}` : name)
  .join('')


console.log(list([{ name: 'Bart' }, { name: 'Lisa' }, { name: 'Maggie' }])); // returns 'Bart, Lisa & Maggie'

console.log(list([{ name: 'Bart' }, { name: 'Lisa' }])); // returns 'Bart & Lisa'

console.log(list([{ name: 'Bart' }])); // returns 'Bart'

console.log(list([])); // returns ''
0 голосов
/ 19 февраля 2019

Здесь идея:

  1. Получить массив имен из входного массива объектов.
  2. Теперь получите длину массива.
  3. Получите последний элементмассив с использованием pop.
  4. Теперь проверьте длину, если длина 0 возвращает empty string, если 1, чем мы возвращаем только имя, если оно больше 1, чем объединение ввода с , и & и last

function list(input){
  input = input.map(({ name }) => name )
  let length = input.length
  let last = input.pop()
  let op = length === 0 ? "" : length === 1 ? last : input.join(',') + ' & ' +last
  console.log(op)
}

list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ])
list([ {name: 'Bart'}, {name: 'Lisa'} ])
list([ {name: 'Bart'} ])
list([])
0 голосов
/ 19 февраля 2019

Индексы массива начинаются с 0, поэтому length - 1 является последним элементом массива, а не вторым по последнему.

Попробуйте заменить i !== length - 1 на i < length - 2в вашем первом состоянии:

function list(names){
  let output = "";
  let length = names.length;
  for(i=0; i < length; i++){
    if(length > 2 && i < length - 2){
     output += names[i]['name'] + ', ' ;
    }
    else if( i == length - 1 && i !== 0) {
      output += ' & ' + names[i]['name'] ;
    } else{
      output += names[i]['name'];
    }
  }
  return output;
}

console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'}, {name: 'Homer'}, {name: 'Marge'} ]))
// returns Bart, Lisa, Maggie, Homer & Marge

console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]))
// returns 'Bart, Lisa & Maggie'

console.log(list([ {name: 'Bart'}, {name: 'Lisa'} ]))
// returns 'Bart & Lisa'

console.log(list([ {name: 'Bart'} ]))
// returns 'Bart'

console.log(list([]))
// returns ''

Немного очистив его с помощью reduceRight и некоторых функций ES6, мы могли бы также написать это как:

function list(names){
  let length = names.length;
  if (length === 0) {
    return '';
  }

  return names
    .map(n => n.name)
    .reduceRight((acc, cur, i) => `${cur}${i < length - 2 ? ', ' : ' & '}${acc}`);
}

console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'}, {name: 'Homer'}, {name: 'Marge'} ]))
// returns Bart, Lisa, Maggie, Homer & Marge

console.log(list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]))
// returns 'Bart, Lisa & Maggie'

console.log(list([ {name: 'Bart'}, {name: 'Lisa'} ]))
// returns 'Bart & Lisa'

console.log(list([ {name: 'Bart'} ]))
// returns 'Bart'

console.log(list([]))
// returns ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...