Эластичный поиск сводит массив json-объектов в один уровень, используя JavaScript - PullRequest
0 голосов
/ 14 мая 2018

У меня возникла проблема с тем, чтобы сгладить мой эластичный ответ на запрос (только мне нужны _источники) в массиве одного уровня.

Пожалуйста, найдите эластичный ответ ниже:

Использование (response.hits.Хиты) Я могу получить массив данных, но не могу сгладить массив объектов в один уровень

Текущий массив:

var current_array = [
    {
        "_id": "gSdhs8aPjcUjiIs6ey85",
        "_score": 1,
        "_source": {
            "business_type": "Primary Only",
            "ceo_name": "Tim Cook",
            "city": "San Ramon",
            "company_id": "gSdhs8aPjcUjiIs6ey85",
            "company_name": "Apple Inc."
        }
    },
    {
        "_id": "v2bdB5F3PbLzziayKikS",
        "_score": 1,
        "_source": {
            "bankruptcy_activity": "No",
            "business_type": "Primary Only",
            "ceo_name": "Andrew N. Liveris",
            "city": "New York",
            "company_id": "v2bdB5F3PbLzziayKikS",
            "company_name": "General Electric",
            "country": "United States"
        }
    }
];

Желаемый результат:

var desired_array = [{
        "_id": "gSdhs8aPjcUjiIs6ey85",
        "_score": 1,
        "_source_business_type": "Primary Only",
        "_source_ceo_name": "Tim Cook",
        "_source_city": "San Ramon",
        "_source_company_id": "gSdhs8aPjcUjiIs6ey85",
        "_source_company_name": "Apple Inc."
    },
    {
        "_id": "v2bdB5F3PbLzziayKikS",
        "_score": 1,
        "_source_business_type": "Primary Only",
        "_source_ceo_name": "Andrew N. Liveris",
        "_source_city": "New York",
        "_source_company_id": "v2bdB5F3PbLzziayKikS",
        "_source_company_name": "General Electric",
        "_source_country": "United States"
    }
];

Я попробовал приведенный ниже код, но он конвертируется в один массив, который мне не нужен:

var flattenObject = function (ob) {
    var toReturn = [];
    var flatObject;
    for (var i in ob) {
        if (!ob.hasOwnProperty(i)) {
            continue;
        }
        if ((typeof ob[i]) === 'object') {
            flatObject = flattenObject(ob[i]);
            for (var x in flatObject) {
                if (!flatObject.hasOwnProperty(x)) {
                    continue;
                }
                toReturn[i + (!!isNaN(x) ? '.' + x : '')] = flatObject[x];
            }
        } else {
            toReturn[i] = ob[i];
        }
    }
    return toReturn;
};

Это дает вывод, как показано ниже:

var undesired_array = [
    0. _index: "company",
    0. _score: 1,
    0. _source.ceo_name: "Tim Cook",
    0. _source.city: "San Ramon",
    0. _source.company_name: "Apple Inc.",
    1. _id: "v2bdB5F3PbLzziayKikS",
    1. _index: "company",
    1. _score: 1,
    1. _source.ceo_name: "Andrew N. Liveris",
    1. _source.city: "New York",
    1. _source.company_id: "v2bdB5F3PbLzziayKikS",
    1. _source.company_name: "General Electric"
];

1 Ответ

0 голосов
/ 07 марта 2019

Учитывая только один уровень вложенности в каждом объекте, этот код должен работать.

function flattenObject(input) {
    return input.map(function (doc) {
        let flatDoc = {};
        Object.keys(doc).forEach(function (key) {
            if (doc[key]instanceof Object) {
                Object.keys(doc[key]).forEach(function (innerkey) {
                    flatDoc[key + "_" + innerkey] = doc[key][innerkey];
                });
            } else {
                flatDoc[key] = doc[key];
            }
        });
        return flatDoc;
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...