2017-09-27 184 views
1

我想返回只包含一個指定的值使用下劃線

var messages: [{ 
    id: 1, 
    name: "John", 
    hashtag: ["#cool"]}, 

    {id: 2, 
    name: "Bob", 
    hashtag: ["#cool", "#sweet"]}, 

    {id: 3, 
    name: "Bob", 
    hashtag: ["#sweet"]} ]; 

// supposed to return the first two items in the array 
var newArray = _.where(messages, {hashtag: "#cool"}); 
+1

您可能需要使用'filter'與顯式謂詞函數。 '哪裏'不會匹配數組的字符串。 – Bergi

+0

'messages.filter(m => m.hashtag.find(h => h ==='#cool'))'應該是一個簡單而簡單的vanilla js函數,它足以滿足您的需求。 – DmiN

回答

1

這裏是你可以用下劃線做一個純粹的功能性的方式,不過,更喜歡Ramda對於這種事情:

var messages = [{ 
 
    id: 1, 
 
    name: "John", 
 
    hashtag: ["#cool"] 
 
    }, 
 

 
    { 
 
    id: 2, 
 
    name: "Bob", 
 
    hashtag: ["#cool", "#sweet"] 
 
    }, 
 

 
    { 
 
    id: 3, 
 
    name: "Bob", 
 
    hashtag: ["#sweet"] 
 
    } 
 
] 
 

 
var newArray = _.filter(messages, _.compose(_.partial(_.contains, _, '#cool'), _.property('hashtag'))) 
 

 
console.log(newArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

1

可以很好地利用過濾器過濾數組的數組返回一個新的數組,但你的對象竟有些語法錯誤。這些值必須是字符串。表明這個例子:

var messages=[ { 
 
    id: 1, 
 
    name: "John", 
 
    hashtag: ["#cool"] }, 
 

 
    {id: 2, 
 
    name: "Bob", 
 
    hashtag: ["#cool"," #sweet"] }, 
 

 
    {id: 3, 
 
    name: "Bob", 
 
    hashtag: ["#sweet"] 
 
\t }]; 
 
\t var newArray=messages.filter(function(task){ return task.hashtag.includes("#cool") }); 
 

 
\t console.log(newArray);

1

無法使用過濾存儲在「hashtag」中的數組(因爲它搜索的鍵值對的字符串),但你可以使用_.filter

var filtered = _.filter(messages, function(message){ 
    return message['hashtag'].indexOf('#cool') !== -1; 
}); 

小codepen證明它的工作去做:https://codepen.io/iwantwin/pen/oGWNzv