在嵌套三元组中遇到一些问题:
简介:
返回:一个字符串,格式为由逗号分隔的名称列表,但最后两个名称除外,这两个名称应以&符号分隔。
示例输入和输出:
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
);
}
三是工作但不是一两个
答案 0 :(得分:3)
这是我的方法:
function list(arr) {
return arr.map(function(person) { return person.name; }) // Use only .name
.join(", ") // Join with ", "
.replace(/, (?!.*, )/, " & "); // Replace last ", " with " & "
}
答案 1 :(得分:2)
我试过这样的事情:
M(B,2)==1
M(N,2)!=1
答案 2 :(得分:1)
我认为您的逻辑仅适用于长度检查。
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"
答案 3 :(得分:0)
这是一种更简单的方法来实现你想要的东西
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(' & ');
}
答案 4 :(得分:0)
这个函数只会在没有任何魔法的情况下通过你的数组进行一次旅行,并且应该产生非常一致的结果。
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;
}
答案 5 :(得分:0)
我是这样做的
var list = (names) => names.map(person => person.name).join(', ').replace(/(.*),(.*)$/, "$1 &$2")
请注意,箭头功能符合ES6。