2016-07-08 4 views
3

Я хотел бы использовать функцию reduce вместо этого делать:Сокращение массива в одну строку

var result = ''; 
authors.forEach(
    function(author) { 
     result += author.name + ', '; 
    } 
); 
console.log(result); 

Так в массиве authors есть несколько имен. Теперь я хочу построить строку с этими именами, разделенную запятой (кроме последней).

var result = authors.reduce(function (author, index) { 
    return author + ' '; 
}, ''); 
console.log(result); 
+3

почему бы не использовать присоединиться? – epascarello

+0

Если вы хотите использовать сокращение или цикл по какой-либо причине, вам нужно добавить проверку, чтобы увидеть, является ли текущий элемент цикла последним. Но просто используйте join, это одна строка кода, чтобы получить то, что вы хотите. – Shilly

ответ

6

Шлейф ответов только что появился, и вот еще один!

Первый вариант использует встроенный метод js join, который устраняет необходимость в сокращении. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join

var authors = ['some author', 'another author', 'last author']; 
var authorString = authors.join(","); 
console.log(authorString); 

ВАЖНО - если вы массив содержит объекты, то вы можете отобразить его до прихода:

var authors = [{name: 'some author'},{name: 'another author'},{name: 'last author'}] 
var authorString = authors.map(function(author){ 
    return author.name; 
}).join(","); 
console.log(authorString); 

или, если вы действительно разжег об использовании уменьшить, просто убедитесь, что вы используете предыдущее значение, текущее значение и индекс при передаче в обратном вызове. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

var authorString = authors.reduce(function(prevVal,currVal,idx){ 
    return idx == 0 ? currVal : prevVal + ', ' + currVal; 
}, '') 
console.log(authorString); 

ВАЖНО - снова если массив содержит объекты, то вы хотите, чтобы убедиться, что вы используете «Свойство Имя»:

var authors = [{name: 'some author'},{name: 'another author'},{name: 'last author'}]; 
var authorString = authors.reduce(function(prevVal,currVal,idx){ 
    return idx == 0 ? currVal.name : prevVal + ', ' + currVal.name; 
}, '') 
console.log(authorString); 
1

Вы повторно изобретая присоединиться()

var authors = ["a","b","c"]; 
 
var str = authors.join(", "); 
 
console.log(str);

, если вы хотите использовать уменьшить добавьте, если проверка

var authors = ["a","b","c"]; 
 

 
var result = authors.reduce(function (author, val, index) { 
 
    var comma = author.length ? ", " : ""; 
 
    return author + comma + val; 
 
}, ''); 
 
console.log(result);


Так как я пропустил отображение часть, чтобы сделать людей счастливыми ...

var authors = [{ 
 
    name: "a" 
 
}, { 
 
    name: "b" 
 
}, { 
 
    name: "c" 
 
}]; 
 

 
var res = authors.map(function(val) { return val.name; }).join(", "); 
 
console.log(res);

ИЛИ

var authors = [{ 
 
    name: "a" 
 
}, { 
 
    name: "b" 
 
}, { 
 
    name: "c" 
 
}]; 
 
var result = authors.reduce(function(author, val, index) { 
 
    var comma = author.length ? ", " : ""; 
 
    return author + comma + val.name; 
 
}, ''); 
 
console.log(result);

+0

Он хочет присоединиться к автору ** имена ** –

+0

@ Bálint Я не понял это из сообщения. Пример мог бы помочь. – epascarello

+0

Вы могли бы просто взглянуть на код –

0

Попробуйте это:

var authors = ["Mikel", "Brad", "Jessy", "Pof", "MArting"] 
 
var result = authors.reduce((prev, curr) => prev +', '+ curr) 
 

 
console.log(result)

+1

Он хочет присоединяйтесь к именам авторов, а не к авторам. Каждый автор является объектом –

8

справа, так что объект. Сначала назовите их имена:

var result = authors.map(function(author) { 
    return author.name; 
}).join(', '); 
+0

Это лучший ответ, ИМО. –

+0

@SpencerJudd Это сложнее –

+0

Я не согласен. Я думаю, что это вполне логично. Вы хотите «присоединиться» к 'name'. Чтобы получить 'имя', вы используете 'map'. 'map' отлично подходит для выщипывания свойств объектов. –

0

Я наткнулся на это также. Большинство этих ответов не учитывают, что вы хотите, чтобы имя пользователя было, что означает, что у вас есть массив объектов.

Раствор одна строки:

authors.reduce((prev, curr) => [...prev, curr.name], []).join(', '); 
Смежные вопросы