在Map函数中生成字符串的多个条件

时间:2016-08-28 15:44:23

标签: javascript loops dictionary ecmascript-6

我正在存储一个类似于:

的数组
let arr = [
  {
   name: "James",
   age: 24
  },
   name: "Patrick", 
   age: 20
  },
  {
   name: "John",
   age: 23
  }
];

我想获得一个看起来像的字符串:

Hi James, Patrick and John
        ^          ^
        |          |
      Comma       And

在每个名称后面添加,(逗号),但不能在最后一个名称之后添加And。在最后一个单词之前的单词arr.map((l,i) => <span key={i}> {i < arr.length - 1 ? `${l.name}, ` : i === arr.length - 1 ? `and ${l.name}.` : ''} </span>) 。我正在使用Map:

James, Patrick, and John
              ^
              |
         This is Extra 

我明白了:

connect

有没有一种美丽而简单的方法来获得这样的结果?和一个纯粹的函数,可以处理数组中的所有名称?最好是ES6 ..谢谢!

4 个答案:

答案 0 :(得分:3)

您可以使用reduce()执行此操作

&#13;
&#13;
let arr = [{
  name: "James",
  age: 24
}, {
  name: "Patrick",
  age: 20
}, {
  name: "John",
  age: 23
}];

var result = arr.reduce(function(r, e, i) {
  if ((i + 1) == (arr.length - 1)) {
    r += e.name;
  } else if ((i + 1) != arr.length) {
    r += e.name + ', ';
  } else {
    r += ' and ' + e.name;
  }
  return r;
}, 'Hi ');

console.log(result)
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我认为你正在寻找

const names = arr.map((l,i) => html`<span key="${i}">${l.name}</span`);
const last = names.pop();
return names.length ? names.join(", ") + " and  " + last : last;

不要将map用于所有项目不相同的部分。

答案 2 :(得分:0)

你可以这样做。

arr.map((l,i) =>
  if (i <arr.length-1) {
    if(i === arr.length-2) {
  <span key={i}>
     {`${l.name} `}
  </span>)
    } else {
  <span key={i}>
     {`${l.name}, `}
  </span>)        
    }
  } else {
  <span key={i}>
     `and ${l.name}.`
  </span>)
 }

答案 3 :(得分:0)

您可以尝试使用以下代码

arr.map((l,i) =>
  <span key={i}>
    {i < arr.length - 1 && i !== arr.length - 2 ? `${l.name}, ` : ''}
    {i === arr.length - 2 ?  `${l.name} ` : ''}
    {i === arr.length - 1 ? `and ${l.name}.` : ''}
  </span>)