сортировать по вложенному значению в массиве объектов - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь отсортировать массив объектов в зависимости от того, содержит ли он вложенное значение или нет.Я возился с использованием _.sortBy, уменьшал и сортировал, но у меня ничего не получалось.

вот мой набор данных:

const impacts = [{

impactAreas: [{
      name: "development"
    }, {
      name: "education"
    }],
  },
  {

    impactAreas: [{
      name: "education"
    }],
  },
  {
    impactAreas: [{
      name: "development"
    }, {
      name: "politics"
    }],
  },
  {
    impactAreas: [{
      name: "politics"
    }, {
      name: "education"
    }]
  }
]

function getImpacts(impacts) {
  impacts.forEach(
    impact => impact.impactAreas.reduce((acc, impactArea) => {
      if (impactArea.name === 'politics') {
        console.log(yes)
        return [impactArea, ...acc]
      }
      return [...acc, impactArea];
    }, [])
  )
}

В этом примере я пытался отсортировать, содержит ли объект «policy», но возвращает неопределенное значение.

Вот мой пример jfiddle: https://jsfiddle.net/ycrpaLn5/1/

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Если вы просто заботитесь о политике наверху, уменьшите массив в массив с политикой (1-й) и один без, а затем объедините их:

const impacts = [{ impactAreas: [{ name: "development" }, { name: "education" }] }, { impactAreas: [{ name: "education" }] }, { impactAreas: [{ name: "development" }, { name: "politics" }] }, { impactAreas: [{ name: "politics" }, { name: "education" }] }];

const hasPolitics = ({ impactAreas }) => 
  impactAreas.some(({ name }) => name === 'politics');

const result = [].concat(...impacts.reduce((r, o) => {
  r[hasPolitics(o) ? 0 : 1].push(o);
  
  return r;
}, [[], []]));

console.log(result);

Если вам не нужно сохранять исходный порядок, вы можете добавить элементы, имеющие политику, в начало накопителя уменьшения:

const impacts = [{ impactAreas: [{ name: "development" }, { name: "education" }] }, { impactAreas: [{ name: "education" }] }, { impactAreas: [{ name: "development" }, { name: "politics" }] }, { impactAreas: [{ name: "politics" }, { name: "education" }] }];

const hasPolitics = ({ impactAreas }) => 
  impactAreas.some(({ name }) => name === 'politics');

const result = impacts.reduce((r, o) =>
  hasPolitics(o) ? [o, ...r] : [...r, o]
, []);

console.log(result);
0 голосов
/ 09 октября 2018

Предполагая, что вы хотите переместить все элементы с politics наверх, тогда вы должны использовать проверку для вложенного массива и принять дельту проверок в качестве возвращаемого значения для сортировки.

var impacts = [{ impactAreas: [{ name: "development" }, { name: "education" }] }, { impactAreas: [{ name: "education" }] }, { impactAreas: [{ name: "development" }, { name: "politics" }] }, { impactAreas: [{ name: "politics" }, { name: "education" }] }],
    POLITICS = ({ name }) => name === 'politics';

impacts.sort(({ impactAreas: a }, { impactAreas: b }) =>
    b.some(POLITICS) - a.some(POLITICS));

console.log(impacts);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...