Voici une partie du résultat obtenu à partir d'une requête ElasticSearch.

"buckets": [{
    "key": "another_service_name:0.0.1",
    "doc_count": 105,
    "containers": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": "7eaf4933b0366f7212f30f9f3c315672ea18e026922d0651b29b844763be6b0a",
            "doc_count": 105,
            "someField": {
                "value": 1.2708647376015072
            }
        }]
    }
}, {
    "key": "my_service_name:0.0.1",
    "doc_count": 200,
    "containers": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": "4c27931147386d49e90f581a1d5cb22f53cda00b16107864cad9eff32f61d776",
            "doc_count": 100,
            "someField": {
                "value": 77.9621390914917
            }
        }, {
            "key": "392e7e6981cd4c24c526ffda03977b7984ebcae58194680c82940af4acec4748",
            "doc_count": 100,
            "someField": {
                "value": 76.63604362487793
            }
        }]
    }
}]

Existe-t-il un simple 1-liner pour supprimer tous les éléments du tableau externe buckets qui n'ont pas le key contenant my_service_name?

Je sais que je pourrais boucler le tableau, utiliser indexOf et splice .. mais y a-t-il un moyen plus court?

J'aimerais que le résultat ressemble à ceci.

"buckets": [{
    "key": "my_service_name:0.0.1",
    "doc_count": 200,
    "containers": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": "4c27931147386d49e90f581a1d5cb22f53cda00b16107864cad9eff32f61d776",
            "doc_count": 100,
            "someField": {
                "value": 77.9621390914917
            }
        }, {
            "key": "392e7e6981cd4c24c526ffda03977b7984ebcae58194680c82940af4acec4748",
            "doc_count": 100,
            "someField": {
                "value": 76.63604362487793
            }
        }]
    }
}]
0
bobbyrne01 16 janv. 2017 à 15:50

2 réponses

Meilleure réponse

Vous pouvez utiliser Array.prototype.filter méthode:

var queryResults = /* your result as above */;

var myServices = queryResults.filter(function(element) {
    return element.key.indexOf('my_service_name') >= 0;
})

Dans ES6, il est possible de raccourcir ceci en:

let queryResults = /* your result as above */;

let myServices = queryResults.filter(element => element.key.includes('my_service_name'))
2
duncanhall 16 janv. 2017 à 13:17

Un one-liner peut être le Array.filter méthode, comme ceci:

buckets.filter( item => /my_service_name:/i.test(item.key) );

Comme le mentionne lonesomeday, la fonction de flèche ne fonctionne pas dans Internet Explorer (et le filtre peut ne pas fonctionner), pour continuer à utiliser cette doublure presque unique, vous pouvez la réécrire comme suit:

buckets.filter( function(item) { return /my_service_name:/i.test( item.key ); } );

Pour prendre en charge les filtres dans Internet Explorer, vous pouvez utiliser le polyfill fourni sur la page MDN

var buckets = [{
    "key": "another_service_name:0.0.1",
    "doc_count": 105,
    "containers": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": "7eaf4933b0366f7212f30f9f3c315672ea18e026922d0651b29b844763be6b0a",
            "doc_count": 105,
            "someField": {
                "value": 1.2708647376015072
            }
        }]
    }
}, {
    "key": "my_service_name:0.0.1",
    "doc_count": 200,
    "containers": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": "4c27931147386d49e90f581a1d5cb22f53cda00b16107864cad9eff32f61d776",
            "doc_count": 100,
            "someField": {
                "value": 77.9621390914917
            }
        }, {
            "key": "392e7e6981cd4c24c526ffda03977b7984ebcae58194680c82940af4acec4748",
            "doc_count": 100,
            "someField": {
                "value": 76.63604362487793
            }
        }]
    }
}];

console.log( buckets.filter( item => /my_service_name:/i.test(item.key) ) );
1
Icepickle 16 janv. 2017 à 13:42