วิธีกรองตามคุณสมบัติของวัตถุใน angularJS


139

ฉันกำลังพยายามสร้างตัวกรองแบบกำหนดเองใน AngularJS ที่จะกรองรายการของวัตถุตามค่าของคุณสมบัติเฉพาะ ในกรณีนี้ฉันต้องการกรองตามคุณสมบัติ "ขั้ว" (ค่าที่เป็นไปได้ของ "บวก", "เป็นกลาง", "เชิงลบ")

นี่คือรหัสการทำงานของฉันที่ไม่มีตัวกรอง:

HTML:

<div class="total">
    <h2 id="totalTitle"></h2>
    <div>{{tweets.length}}</div>
    <div id="totalPos">{{tweets.length|posFilter}}</div>
    <div id="totalNeut">{{tweets.length|neutFilter}}</div>
    <div id="totalNeg">{{tweets.length|negFilter}}</div>
</div>

นี่คืออาร์เรย์ "$ scope.tweets" ในรูปแบบ JSON:

{{created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user       screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"}}

ตัวกรองที่ดีที่สุดที่ฉันสามารถทำได้มีดังนี้:

myAppModule.filter('posFilter', function(){
return function(tweets){
    var polarity;
    var posFilterArray = [];
    angular.forEach(tweets, function(tweet){
        polarity = tweet.polarity;
        console.log(polarity);
        if(polarity==='Positive'){
              posFilterArray.push(tweet);
        }
        //console.log(polarity);
    });
    return posFilterArray;
};
});

วิธีนี้จะส่งกลับอาร์เรย์ที่ว่างเปล่า และไม่มีการพิมพ์จากคำสั่ง "console.log (ขั้ว)" ดูเหมือนว่าฉันไม่ได้ใส่พารามิเตอร์ที่ถูกต้องเพื่อเข้าถึงคุณสมบัติวัตถุของ "ขั้ว"

ความคิดใด ๆ คำตอบของคุณได้รับการชื่นชมอย่างมาก


3
เป็นคำถามที่ดี แต่รหัสอาจลดลงได้ส่วนใหญ่ไม่เกี่ยวข้องกับคำถาม
setec

คำตอบ:


218

คุณเพียงแค่ต้องใช้filterตัวกรอง (ดูเอกสารประกอบ ):

<div id="totalPos">{{(tweets | filter:{polarity:'Positive'}).length}}</div>
<div id="totalNeut">{{(tweets | filter:{polarity:'Neutral'}).length}}</div>
<div id="totalNeg">{{(tweets | filter:{polarity:'Negative'}).length}}</div>

Fiddle


1
มีวิธีการกรองรายการไอเท็มโดยส่งผ่านตัวกรองที่กำหนดเองไปยังเหตุการณ์ ng-click นอกคำสั่ง ng-repeat หรือไม่ ในกรณีนี้ฉันต้องการวางสามปุ่ม "ขั้ว" เหนือผลลัพธ์ที่กรองตามการจัดอันดับ
sh3nan1gans

2
ฉันไม่แน่ใจที่จะเข้าใจ หากคุณต้องการเลือกขั้วที่จะกรองคุณสามารถส่งผ่านตัวแปรขอบเขตแทนข้อความธรรมดา: filter:{polarity:polarityToFilter}ที่$scope.polarityToFilterเต็มไปด้วยการคลิกที่หนึ่งในสามปุ่ม นี่คือสิ่งที่คุณพยายามทำใช่หรือไม่
Blackhole

ดูเหมือนว่ามันจะทำงานได้ อย่างไรก็ตามแอพของฉันยังต้องสามารถลบรายการแต่ละรายการได้
sh3nan1gans

ปัญหาเกี่ยวกับการกรองคือการสร้างอาร์เรย์ใหม่ทุกครั้งที่มีการใช้ตัวกรองซึ่งแบ่งการผูกระหว่างรายการที่ถูกกรองและดัชนีดั้งเดิมในอาร์เรย์ที่ไม่มีการกรอง มีวิธีการรักษาเนคไทหรือเป็นทางเลือกเดียวของฉันหรือไม่? นี่คือแบบฝึกหัดสำหรับทางเลือกในการกรองโดยใช้ ng-hide: bennadel.com/blog/ ......
sh3nan1gans

ngRepeat exposes $indexที่เหมาะสมในขอบเขตท้องถิ่นที่คุณสามารถใช้
Blackhole

27

เอกสารมีคำตอบที่สมบูรณ์ อย่างไรก็ตามนี่คือวิธีการที่ทำ:

<input type="text" ng-model="filterValue">
<li ng-repeat="i in data | filter:{age:filterValue}:true"> {{i | json }}</li>

จะกรองเฉพาะageในdataอาเรย์และtrueเป็นการจับคู่ที่ตรงกัน

สำหรับการกรองลึก

<li ng-repeat="i in data | filter:{$:filterValue}:true"> {{i}}</li>

$เป็นคุณสมบัติพิเศษสำหรับตัวกรองลึกและtrueสำหรับการแข่งขันที่แน่นอนเช่นดังกล่าวข้างต้น


เรียบง่ายและสะอาด
scaryguy

ตัวกรองนี้อยู่ภายในหรือต้องการเขียนทั้งใน Angular & AngularJS หรือไม่
P Satish Patro

23

คุณสามารถทำเช่นนี้เพื่อให้มีพลังมากขึ้น

<input name="filterByPolarity" data-ng-model="text.polarity"/>

จากนั้นคุณซ้ำจะมีลักษณะเช่นนี้

<div class="tweet" data-ng-repeat="tweet in tweets | filter:text"></div>

แน่นอนว่าตัวกรองนี้จะใช้ในการกรองตามขั้วเท่านั้น


5

เรามีการรวบรวมดังนี้:


ป้อนคำอธิบายรูปภาพที่นี่

ไวยากรณ์:

{{(Collection/array/list | filter:{Value : (object value)})[0].KeyName}}

ตัวอย่าง:

{{(Collectionstatus | filter:{Value:dt.Status})[0].KeyName}}

-หรือ-

ไวยากรณ์:

ng-bind="(input | filter)"

ตัวอย่าง:

ng-bind="(Collectionstatus | filter:{Value:dt.Status})[0].KeyName"

4

คุณสามารถลองสิ่งนี้ มันทำงานสำหรับฉัน'ชื่อ'เป็นคุณสมบัติใน arr

repeat="item in (tagWordOptions | filter:{ name: $select.search } ) track by $index
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.