简体   繁体   中英

How do I filter and structure this JSON?

I have a array of json objects known as events, which has fields like eventId, eventName and most importantly dateofevent.

[{event1}, {event2}, {event3}];

I need to iterate over this array of events and filter out the events that are on the same day. To obtain a new object like this.

"days": [
    {
        "date": "11-05-2015",
        "events": [
            {"eventId": 1, ...},
            {"eventId": 2, ...},
            {"eventId": 3, ...},
            {"eventId": 4, ...},
        ]
    },

How can I do this efficiently with Javascript or Angular?

You can create a new object with the dates as keys, and the values are arrays that contain the events. After you have the date => events map, convert it to array in the structure you want.

Assuming the original data is in a variable called "events":

    var events  = [{event 1}, {event 2}...];
    var daysMap = {};
    var days = [];
    events.map(function(event) {
        if (days[event.dateofevent] === undefined) {
            days[event.dateofevent] = [];
        }
        days[event.dateofevent].push(event);
    });
    for (var day in daysMap) {
        days.push({
            date: day, 
            events: daysMap[day]
        });
    }

HTML

<div ng-app>
    <span class="bold">Demonstrating filtering and sorting using Angular JS</span>
    <br /><br />
        <div ng-controller="ShoppingCartCtrl">        
            <div>Sort by: 
            <select ng-model="sortExpression">
                    <option value="Name">Name</option>
                    <option value="Price">Price</option>
                    <option value="Quantity">Quantity</option>
                </select>
            </div>
            <br />
            <div><strong>Filter Results</strong></div>
            <table>
                <tr>
                    <td>By Any: </td>
                    <td><input type="text" ng-model="search.$" /></td>
                </tr>
                <tr>
                    <td>By Name: </td>
                    <td><input type="text" ng-model="search.Name" /></td>
                </tr>
                <tr>
                    <td>By Price: </td>
                    <td><input type="text" ng-model="search.Price" /></td>
                </tr>
                <tr>
                    <td>By Quantity: </td>
                    <td><input type="text" ng-model="search.Quantity" /></td>
                </tr>
            </table>
            <br />
            <table border="1">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Price</th>
                        <th>Quantity</th>
                    </tr>
                </thead>
                <tbody>
                    <tr ng-repeat="item in items | orderBy:mySortFunction | filter:search">
                        <td>{{item.Name}}</td>
                        <td>{{item.Price | currency}}</td>
                        <td>{{item.Quantity}}</td>
                    </tr>
                </tbody>
            </table>
            <br />
</div>
</div>

Javascript

function ShoppingCartCtrl($scope)  {

        $scope.items = [
            {Name: "Soap", Price: "25", Quantity: "10"},
            {Name: "Shaving cream", Price: "50", Quantity: "15"},
            {Name: "Shampoo", Price: "100", Quantity: "5"}
        ];

        $scope.mySortFunction = function(item) {
            if(isNaN(item[$scope.sortExpression]))
                return item[$scope.sortExpression];
            return parseInt(item[$scope.sortExpression]);
        }
}

CSS

.bold { font-weight:bold; }

table td{
    padding: 10px;
}

table th{
    font-weight: bold;
    text-align: center;
}

demo_click here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM