Как отсортировать сложный объект по вложенному значению - PullRequest
0 голосов
/ 08 февраля 2019

У меня проблемы с попыткой отсортировать сложный объект.Это структура объекта:

[{
    "searchResultProperties": [{
        "key": "message_time",
        "value": 1542088800000
    }, {
        "key": "size_byte AVG",
        "value": 480
    }, {
        "key": "source_file",
        "value": "log"
    }, {
        "key": "source_host",
        "value": "lab8.domain.com"
    }],
    "show": false,
    "key": null,
    "type": null
}, {
    "searchResultProperties": [{
        "key": "message_time",
        "value": 1542096000000
    }, {
        "key": "size_byte AVG",
        "value": 373
    }, {
        "key": "source_file",
        "value": "log"
    }, {
        "key": "source_host",
        "value": "lab8.domain.com"
    }],
    "show": false,
    "key": null,
    "type": null
}, {
    "searchResultProperties": [{
        "key": "message_time",
        "value": 1542103200000
    }, {
        "key": "size_byte AVG",
        "value": 683
    }, {
        "key": "source_file",
        "value": "log"
    }, {
        "key": "source_host",
        "value": "lab8.domain.com"
    }],
    "show": false,
    "key": null,
    "type": null
}]

По сути, это массив объектов со свойством «searchResultProperties», который представляет собой массив объектов со свойствами «key» и «value».

Я пытаюсь отсортировать по свойству "ключ", то есть: "size_byte AVG".

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы можете использовать sort и find

sort принимает два значения в качестве аргумента.С помощью find мы находим элемент массива с ключом 'size_byte AVG', извлекаем из него значение и сравниваем значения

let arr = [{"searchResultProperties": [{"key": "message_time","value": 1542088800000}, {"key": "size_byte AVG","value": 480}, {"key": "source_file",       "value": "log"}, {"key": "source_host","value": "lab8.domain.com"}],"show": false,"key": null, "type": null}, { "searchResultProperties": [{"key": "message_time","value": 1542096000000}, {"key": "size_byte AVG","value": 373}, {"key": "source_file","value": "log"}, {"key": "source_host","value": "lab8.domain.com"}],"show": false,"key": null, "type": null}, {"searchResultProperties": [{"key": "message_time","value": 1542103200000}, {"key": "size_byte AVG","value": 683 }, { "key": "source_file","value": "log"}, {"key": "source_host","value": "lab8.domain.com"}],"show": false,"key": null,"type": null}]

let op = arr.sort((a,b)=>
         a.searchResultProperties.find(e=>e.key==='size_byte AVG').value -
         b.searchResultProperties.find(e=>e.key==='size_byte AVG').value)

console.log(op)
0 голосов
/ 08 февраля 2019

Вы можете использовать функцию find для поиска объектов с ключом size_byte AVG и функцию sort для сортировки массива.

Этот подход сортирует по возрастанию

let arr = [{    "searchResultProperties": [{        "key": "message_time",        "value": 1542088800000    }, {        "key": "size_byte AVG",        "value": 480    }, {        "key": "source_file",        "value": "log"    }, {        "key": "source_host",        "value": "lab8.domain.com"    }],    "show": false,    "key": null,    "type": null}, {    "searchResultProperties": [{        "key": "message_time",        "value": 1542096000000    }, {        "key": "size_byte AVG",        "value": 373    }, {        "key": "source_file",        "value": "log"    }, {        "key": "source_host",        "value": "lab8.domain.com"    }],    "show": false,    "key": null,    "type": null}, {    "searchResultProperties": [{        "key": "message_time",        "value": 1542103200000    }, {        "key": "size_byte AVG",        "value": 683    }, {        "key": "source_file",        "value": "log"    }, {        "key": "source_host",        "value": "lab8.domain.com"    }],    "show": false,    "key": null,    "type": null}],
    target = "size_byte AVG",
    compare = (a, b) => a.find(({key}) => key === target).value - b.find(({key}) => key === target).value,
    sorted = arr.sort(({searchResultProperties: a}, {searchResultProperties: b}) => compare(a, b));

console.log(sorted);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 08 февраля 2019

Вы можете использовать функцию Array.prototype.sort(), которая дает вам два объекта, и вы можете вернуть значение + ve или -ve на основе вашей логики для сортировки.См. [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort]

array = [{
    "searchResultProperties": [{
        "key": "message_time",
        "value": 1542088800000
    }, {
        "key": "size_byte AVG",
        "value": 480
    }, {
        "key": "source_file",
        "value": "log"
    }, {
        "key": "source_host",
        "value": "lab8.domain.com"
    }],
    "show": false,
    "key": null,
    "type": null
}, {
    "searchResultProperties": [{
        "key": "message_time",
        "value": 1542096000000
    }, {
        "key": "size_byte AVG",
        "value": 373
    }, {
        "key": "source_file",
        "value": "log"
    }, {
        "key": "source_host",
        "value": "lab8.domain.com"
    }],
    "show": false,
    "key": null,
    "type": null
}, {
    "searchResultProperties": [{
        "key": "message_time",
        "value": 1542103200000
    }, {
        "key": "size_byte AVG",
        "value": 683
    }, {
        "key": "source_file",
        "value": "log"
    }, {
        "key": "source_host",
        "value": "lab8.domain.com"
    }],
    "show": false,
    "key": null,
    "type": null
}]

array = array.sort((a,b) => a.searchResultProperties.find(obj => obj.key === "size_byte AVG").value - b.searchResultProperties.find(obj => obj.key === "size_byte AVG").value )

console.log(array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...