Сортировать только несколько объектов из массива объектов, полученных из ответа API в React - PullRequest
1 голос
/ 17 марта 2020

Я ищу эффективный способ сортировки ответа API, который является массивом объектов. В этом массиве много полей, и я хочу отсортировать только несколько из них.

Массив выглядит следующим образом

result =  {type: Array(), status: Array(), nature: Array(), health: Array(), fitness: Array(), wealth: Array()}

, а у массива есть свойство name и value, например {name:"", value:""}

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

const typeName = "type"
if(result[typeName]){
    result[typeName] = sortingFunction(result[typeName], "name")
}

Теперь мне нужно отсортировать и другие поля, а также несколько полей, которые мне нужно отсортировать на основе " стоимость "имущества, а также. Поэтому, пожалуйста, дайте мне знать, если у вас есть эффективный способ сделать это.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Вы можете создать функцию сортировки, которая может сортировать входной объект given для заданных ключей.

Я создал образец функции для сортировки.

Эта функция имеет два параметра.

  1. Первый object, который нужно отсортировать
  2. Второй параметр, вы можете передать параметр для сортировки.
    a. sortBy: имя свойства, по которому функция будет выполнять сортировку.
    b. sortKeys: Array | Строка, ключи / ключ объекта, которые необходимо отсортировать.

Функция:

function sortObject(input, options = {}) {
    if (!options)
        return;

    let keys = options.sortKeys;
    let sortBy = options.sortby



    if (!sortBy) {
        console.error("sort by option is not defiend");
        return;
    }

    if (!keys) {
        console.error("sort keys are not defiend");
        return;
    }


    if (Array.isArray(keys) && keys.length > 0) {
        keys.forEach(item => sortObjectByKey(item, sortBy));
        return;
    }

    if (typeof keys === "string" && keys) {
        sortObjectByKey(keys, sortBy);
        return;
    }

    function sortObjectByKey(sortKey, sortBy) {
        input[sortKey].sort(function (a, b) {
            let _a = (typeof a[sortBy] === "string") ? a[sortBy].toLowerCase() : a[sortBy];
            let _b = (typeof b[sortBy] === "string") ? b[sortBy].toLowerCase() : b[sortBy];
            if (_a < _b)
                return -1
            if (_a > _b)
                return 1
            return 0
        });
    }
}

Пример:

//sortObject(sampleObject, { sortby: ["name", "value"], sortKeys: ["status", "type"] });
function sortObject(input, options = {}) {
    if (!options)
        return;

    let keys = options.sortKeys;
    let sortBy = options.sortby



    if (!sortBy) {
        console.error("sort by option is not defiend");
        return;
    }

    if (!keys) {
        console.error("sort keys are not defiend");
        return;
    }


    if (Array.isArray(keys) && keys.length > 0) {
        keys.forEach(item => sortObjectByKey(item, sortBy));
        return;
    }

    if (typeof keys === "string" && keys) {
        sortObjectByKey(keys, sortBy);
        return;
    }

    function sortObjectByKey(sortKey, sortBy) {
        input[sortKey].sort(function (a, b) {
            let _a = (typeof a[sortBy] === "string") ? a[sortBy].toLowerCase() : a[sortBy];
            let _b = (typeof b[sortBy] === "string") ? b[sortBy].toLowerCase() : b[sortBy];
            if (_a < _b)
                return -1
            if (_a > _b)
                return 1
            return 0
        });
    }
}

let sampleObject = {
    type: [
        { name: "c", value: 4 },
        { name: "a", value: 2 },
        { name: "b", value: 1 },
        { name: "d", value: 3 },
    ],
    status: [
        { name: "c", value: 25 },
        { name: "a", value: 25 },
        { name: "b", value: 25 },
        { name: "d", value: 25 },
    ],
    nature: [
        { name: "c", value: 25 },
        { name: "a", value: 25 },
        { name: "b", value: 25 },
        { name: "d", value: 25 },
    ],
}
sortObject(sampleObject, { sortby: "value", sortKeys: ["type"] });
sortObject(sampleObject, { sortby: "name", sortKeys: ["status", "nature"] });
console.log(sampleObject)
1 голос
/ 17 марта 2020

Один из способов - преобразовать объект массивов в массив объектов, а затем объединить его после сортировки.

const result = {
  type: ['foo', 'bar', 'baz'], 
  status: [4, 3, 5],
  nature: ['forest', 'animal', 'water'],
  health: ['athlete', 'couch potato', 'dead'],
  fitness: [200, 50, 60],
  wealth: [5, 2, 99]
};

// 1. combine
const combined = result.type.map((_, index) => {
  return Object.fromEntries(Object.keys(result).map(key => [key, result[key][index]]));
});

// 2. example sort by status
combined.sort((a, b) => a.status - b.status)

// 3. merge
combined.forEach((object, index) => {
  for (const [key, value] of Object.entries(object)) {
    result[key][index] = value
  }
})

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