嵌套三元 javascript

Nested ternary javascript

嵌套三元有问题:

简介:

Return:一个字符串,格式为以逗号分隔的名称列表,但最后两个名称应以“&”符号分隔。

示例输入和输出:

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

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

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

我的 JS:

var cache = '';
var data = [ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'}];
  for (i = 0 ; i < data.length; i++) {
    var people = data[i];

        cache += people.name + 
        (i==((length === 2) || (length === -1 )) ? ' & ' : // (if has two or is before last)
        (i==((length >= 3 ) || (length < 2)) ? ', ' : '') //not:(if has two or is before last) + >= 3 or < 2
        );
  }

三个有效,但不是一个或两个

这是我的方法:

function list(arr) {
  return arr.map(function(person) { return person.name; }) // Use only .name
  .join(", ") // Join with ", "
  .replace(/, (?!.*, )/, " & "); // Replace last ", " with " & "
}

我试过这样的事情:

function list(data) {
  var arr = [];
  data.map(function (v, i) {
    arr.push(v.name);
  });
  var last = arr.pop();
  return (arr.length > 0) ? arr.join(", ") + " & " + last : last;
}


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'

这里有一个更简单的方法来完成你想要的

function list(data) {
  var firstNames = data.slice(0, -1).map(x => x.name).join(', ');
  var lastName = data.slice(-1).map(x => x.name);
  return [firstNames, lastName].filter(Boolean).join(' & ');
}

我认为您的逻辑不适合长度检查。

var cache = '';
var data = [ {name: 'Homer'}, {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'}];

for (i = 0 ; i < data.length; i++) {
var people = data[i];

    cache += people.name + 
    (i < (data.length - 2) ? ', ' : 
        (i === (data.length - 2) ? ' & ' : ''));
}

结果:"Homer, Bart, Lisa & Maggie"

这个函数只通过你的数组一次,没有任何魔法,应该会产生非常一致的结果。

function getString(data){
    var concat =  data.reduce(function(curr, next, i){
        var separator = (i === data.length - 1) ? ' & ' : ', ';
        return {name: curr.name + separator + next.name};
    });
    return concat.name;
}

我是这样做的

var list = (names) =>  names.map(person => person.name).join(', ').replace(/(.*),(.*)$/, " &")

注意箭头函数符合ES6。