嵌套三元 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。
嵌套三元有问题:
简介:
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。