2016-09-10 2 views
1

В настоящее время у меня есть этот бит кода, чтобы разделить строку и отобразить ее в виде списка.Как пропустить некоторые элементы при использовании карты javascript()

<span className="reply">{this.props.message.split("\n").map((chunk) => { 
    return <span className="message-chunk">{chunk}<br /></span> 
})} 

Я хочу пропустить первый и последний элемент в массиве split, потому что строка имеет форму.

Heading\n 
List Item\n 
List Item\n 
List Item\n 
Ending\n 

Есть ли способ сделать это при использовании функции карты. Я видел упоминание о функции filter() в другом связанном вопросе, но я не думаю, что это применимо здесь. Любая помощь приветствуется.

+0

Вы имеете в виду «skip», как и в предыдущем заголовке, но преобразовываете все остальное или только возвращаете элементы списка? – vlaz

+0

@vlaz Я имею в виду первый – user3282276

+0

@ user3282276 Если один из ответов правильный, отметьте его как таковой. Если ни один из них, пожалуйста, не сообщайте нам о том, как он не решает вашу проблему. Спасибо – winhowes

ответ

6

Одним из вариантов является просто slice массив, прежде чем карта, так что в вашем случае это будет:

this.props.message.split("\n").slice(1, -1).map((chunk) => { 
    return <span className="message-chunk">{chunk}<br /></span> 
}) 

Обратите внимание, что это будет удалить первый и последний элемент из массива. Если вы намереваетесь не изменять первый или последний элемент, я рекомендую ответить @ vlaz :)

+1

slice не мутирует массив, но возвращает новый, так что это лучший ответ. – lustoykov

1

Функция обратного вызова для Array.prototype.map будет передана по трем параметрам - элементу, индексу и массиву. Таким образом, вы можете очень легко пропустить первый и последний элемент при преобразовании

arr.map(function(item, index, list) { 
    if(index === 0 || index === list.length -1) { 
     return item; 
    } else { 
     /* transformation logic */ 
     return transformedItem; 
    } 

}) 
+0

Проблема в том, что первый и последний элементы все еще находятся в возвращенном массиве – winhowes

+0

OP сказал _skip_, что я понял, что они все равно должны быть возвращены. Возможно, требование состоит в том, чтобы удалить их, но это не совсем ясно. – vlaz

+0

справедливой точки. Это неоднозначно – winhowes

1

Довольно чистое решение заключается в том, чтобы хранить массив, разделенный линией. Затем .shift() и .pop() он обрезает края (и сохранит их, если вам нужно), и выполните итерацию обрезанного массива с помощью .map(). :)

// Example with stored heading and ending 
let messageLines = this.props.message.split("\n"); 
const heading = messageLines.shift(); 
const ending = messageLines.pop(); 

// Map whenever you need to 
messageLines.map(...); 
Смежные вопросы