嵌套三值javascript

嵌套三值javascript,javascript,nested,ternary,Javascript,Nested,Ternary,使用嵌套三元函数时遇到一些问题: 简介: list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ]) // returns 'Bart, Lisa & Maggie' list([ {name: 'Bart'}, {name: 'Lisa'} ]) // returns 'Bart & Lisa' list([ {name: 'Bart'} ]) // returns 'Bart' var cache = ''; v

使用嵌套三元函数时遇到一些问题:

简介:

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

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

list([ {name: 'Bart'} ])
// returns 'Bart'
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
        );
  }
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'
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
        );
  }
我的JS:

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

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

list([ {name: 'Bart'} ])
// returns 'Bart'
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
        );
  }
var缓存=”;
var data=[{name:'Bart'},{name:'Lisa'},{name:'Maggie'}];
对于(i=0;i=3)| |(长度<2))?,,,:''/(如果有两个或在最后一个之前)+>=3或<2
);
}
三个有效,但不是一两个

以下是我的方法:

function list(arr) {
  return arr.map(function(person) { return person.name; }) // Use only .name
  .join(", ") // Join with ", "
  .replace(/, (?!.*, )/, " & "); // Replace last ", " with " & "
}
以下是我的方法:

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

我试过这样的方法:

功能列表(数据){
var-arr=[];
数据映射(函数(v,i){
arr.push(v.name);
});
var last=arr.pop();
返回(arr.length>0)?arr.join(“,”+“&”+last:last;
}
log(列表([{name:'Bart'},{name:'Lisa'},{name:'Maggie'}]);
//返回“巴特、丽莎和玛姬”
log(列表([{name:'Bart'},{name:'Lisa'}]);
//返回“Bart&Lisa”
log(列表([{name:'Bart'}]);

//返回“Bart”
我尝试了以下方法:

功能列表(数据){
var-arr=[];
数据映射(函数(v,i){
arr.push(v.name);
});
var last=arr.pop();
返回(arr.length>0)?arr.join(“,”+“&”+last:last;
}
log(列表([{name:'Bart'},{name:'Lisa'},{name:'Maggie'}]);
//返回“巴特、丽莎和玛姬”
log(列表([{name:'Bart'},{name:'Lisa'}]);
//返回“Bart&Lisa”
log(列表([{name:'Bart'}]);

//返回“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(' & ');
}

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

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) ? ' & ' : ''));
}
var缓存=”;
var data=[{name:'Homer'},{name:'Bart'},{name:'Lisa'},{name:'Maggie'}];
对于(i=0;i

结果:
“荷马、巴特、丽莎和玛姬”

我想你的逻辑只是不适合长度检查

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) ? ' & ' : ''));
}
var缓存=”;
var data=[{name:'Homer'},{name:'Bart'},{name:'Lisa'},{name:'Maggie'}];
对于(i=0;i

结果:
“荷马、巴特、丽莎和玛姬”

此函数只在阵列中执行一次,没有任何魔法,并且应产生相当一致的结果

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;
}

这个函数只在数组中执行一次,没有任何魔法,应该会产生相当一致的结果

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(/(.*),(.*)$/, "$1 &$2")
请注意,箭头功能符合ES6

我是这样做的

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

请注意,箭头功能符合ES6

您根本没有定义
长度
?如果要对最后一个元素进行不同的处理,为什么要迭代所有元素?您可以执行类似于
data.slice(0,-1).map(d=>d.name).join(',')+(d.length>1?('&'+data[data.length-1].name):'')的操作。
您根本没有定义
length
。如果希望对最后一个元素进行不同的处理,为什么要迭代所有元素?您可以执行类似于
data.slice(0,-1).map(d=>d.name).join(',')+(d.length>1?('&'+data[data.length-1].name):'
使用
forEach
或将
data.map
的返回值分配给
arr
,但不能同时使用这两种方法;)@FelixKling当然,我什么时候用了“两者”?好吧,你用的是
map
并手动将值推送到数组中。@FelixKling我真是个废物
:(
arr=data.map(函数(v,i){return v.name;});
Right?使用
forEach
或将
data.map
的返回值分配给
arr
,但不是两者都有;)@FelixKling当然,我什么时候使用了“两者”,您正在使用
map
并手动将值推送到数组中。@FelixKling我真是胡说八道
:(
就是这样的:
arr=data.map(函数(v,i){return v.name;});
对吗?