0

次のようなデータがあります。

var data = [{
   id: 1,
   date: new Date("2010-01-01"),
   value: 10
}, {
   id: 2,
   date: new Date("2010-01-01"),
   value: 11
}, {
   id: 3,
   date: new Date("2010-01-01"),
   value: 12
}, {
   id: 4,
   date: new Date("2010-01-02"),
   value: 10
}, {
   id: 5,
   date: new Date("2010-01-03"),
   value: 10
}, {
   id: 6,
   date: new Date("2010-01-03"),
   value: 21
}, {
   id: 7,
   date: new Date("2010-01-03"),
   value: 22
}, {
   id: 8,
   date: new Date("2010-01-03"),
   value: 23
}];

2種類のフィルターを適用しようとしています:

  • Filter1フィールドが1 だけ異なるがvalue同じdateフィールドを持つポイントのみを指定する必要があります。したがって、これは ID 1、2、3、6、7、8 のデータ レコードを含む新しいデータセットを返す必要があります (最初の 3 つは値が 10、11、12 であるため、最後の 3 つは値が 21、22、23 であるため)。
  • Filter2dateフィールドが 1 日異なるが同じフィールドを持つポイントのみを私に与える必要がありvalueます。したがって、これは ID 1、4、5 のデータ レコードを含む新しいデータセットを返す必要があります。

私は現在、サーバー側の C# でこれを行っていますが、Javascript でこれを行う効率的な方法があるかどうかを確認しています。助言がありますか?

4

1 に答える 1

5

もちろん、カスタムソート機能です!

function filter1(arr) {
    // Clone the array:
    arr = arr.slice();

    // Sort the array by value:
    arr.sort(function(a, b) {
        return a.date - b.date || a.value - b.value;
    });

    // Look for consecutive elements with the same date:
    var r = [];

    for(var i = 1; i < arr.length; i++) {
        if(+arr[i - 1].date === +arr[i].date && arr[i - 1].value === arr[i].value - 1) {
            if(r.indexOf(arr[i - 1]) === -1) r.push(arr[i - 1]);
            r.push(arr[i]);
        }
    }

    // Return the result
    return r;
}

function filter2(arr) {
    // Clone the array:
    arr = arr.slice();

    // Sort the array by date:
    arr.sort(function(a, b) {
        return a.value - b.value || a.date - b.date;
    });

    // Look for consecutive elements with the same value:
    var r = [];

    for(var i = 1; i < arr.length; i++) {
        if(arr[i - 1].value === arr[i].value && arr[i].date - arr[i - 1].date <= 24 * 60 * 60 * 1000) {
            if(r.indexOf(arr[i - 1]) === -1) r.push(arr[i - 1]);
            r.push(arr[i]);
        }
    }

    // Return the result
    return r;
}
于 2012-06-21T02:07:45.343 に答える