Как упорядочить массив объектов по количеству ключей, совпадающих с заданными в качестве параметра? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть базовый объект с некоторыми ключами и список объектов с похожими, но не обязательно одинаковыми, ключами.

const o1 = {k1: "", k2: "", k3: ""} // the basic object
const o2 = {k1: "", k4: ""}         // 1 the same key
const o3 = {k1: "", k3: ""}         // 2 the same keys
const o4 = {k3: "", k1: "", k2: ""} // 3 the same keys
const o5 = {k5: ""}                 // 0 the same keys

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

function order(obj, arr) {
  // ...
}

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

order(o1, [o2, o3, o4, o5])
// result: [o4, o3, o2, o5]

Что бы вы использовали для этого?

Я думал о сортировке по длине пересечения на ключах объектов.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вы можете сосчитать те же ключи и принять это значение для сортировки.

const
    o1 = { k1: "", k2: "", k3: "" }, // the basic object
    o2 = { k1: "", k4: "" },         // 1 the same key
    o3 = { k1: "", k3: "" },         // 2 the same keys
    o4 = { k3: "", k1: "", k2: "" }, // 3 the same keys
    o5 = { k5: "" };                 // 0 the same keys

function order(object, array) {
    function getCount(o) {
        return Object.keys(object).reduce((s, k) => s + (k in o), 0);
    }
    return array.sort((a, b) => getCount(b) - getCount(a));
}

console.log(order(o1, [o2, o3, o4, o5])); // [o4, o3, o2, o5]
0 голосов
/ 20 ноября 2018

Использование lodash:

function order(reference, objs) {
  const referenceKeys = _.keys(reference);
  return _.sortBy(objs, obj => -_(referenceKeys).intersection(_.keys(obj)).size());
}

Другой способ:

function order(reference, objs) {
  const referenceKeys = new Set(_.keys(reference));
  return _.sortBy(objs, obj => _(obj).keys().sumBy(key => referenceKeys.has(key) ? -1 : 0))
}
0 голосов
/ 19 ноября 2018

Вы можете использовать комбинацию Object.keys и filter для определения «реальной» длины массива и sort соответственно:

const o1 = {k1: "", k2: "", k3: ""} // the basic object
const o2 = {k1: "", k4: ""}         // 1 the same key
const o3 = {k1: "", k3: ""}         // 2 the same keys
const o4 = {k3: "", k1: "", k2: ""} // 3 the same keys
const o5 = {k5: ""}                 // 0 the same keys

function order(obj, arr) {
  return arr.sort((a, b) => 
              Object.keys(b).filter(k => k in obj).length - 
              Object.keys(a).filter(k => k in obj).length);
}

console.log(order(o1, [o2, o3, o4, o5]));
...