Упорядочить индексы объектов из массива на основе значения общего свойства объекта в два отдельных массива в соответствующем порядке - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть массив объектов, в которых свойство 'selectOrder' может иметь повторяющееся значение только для двух объектов (сценарий: один объект выбирается сразу после другого с тем же значением). Мне нужны два отдельных массива, в которых я могу найти индексы объектов, которые имели совпадающее значение для свойства 'selectOrder' в соответствующих порядках индексов новых массивов.

Редактировать: если повторений нет selectOrder ', тогда индекс объекта повторяется в обоих массивах.

let A = [
0: {id:343, name:'Apple', selectOrder:0},
1: {id:423, name:'Banana' selectOrder:2}
2: {id:234, name:'Cat', selectOrder:3},
3: {id:543, name:'Dog', selectOrder:1},
4: {id:432, name:'Elephant', selectOrder:1},
5: {id:545, name:'Father', selectOrder:0},
];

Требуемый вывод:

Arr1=[0, 3, 1, 2]
Arr2=[5, 4, 1, 2]

Редактировать: в идеале следует сначала добавить индекс объекта с selectOrder: 0 в Arr1, а сразу после этого ищет другие объекты с selectOrder: 0 и добавляет его индекс к Arr2 и так далее для других selectOrders.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

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

let A = [
    {i: 0, id:343, name:'Apple', selectOrder: 0},
    {i: 1, id:423, name:'Banana', selectOrder: 2},
    {i: 2, id:234, name:'Cat', selectOrder: 3},
    {i: 3, id:543, name:'Dog', selectOrder: 1},
    {i: 4, id:432, name:'Elephant', selectOrder: 1},
    {i: 5, id:545, name:'Father', selectOrder: 0},
];

// Sort by selectOrder
A.sort((a, b) => a.selectOrder - b.selectOrder);

let arr1 = [], arr2 = [];

A.forEach((item, i) => {
  if (!arr1.find((x, k) => k === item.selectOrder)) {
    arr1.push({[item.selectOrder]: item.i});
  } else if (!arr2.find((x, k) => k === item.selectOrder)) {
    arr2.push({[item.selectOrder]: item.i});
  }
});

// Push the extra values from arr1 into arr2
arr2 = [...arr2, ...arr1.slice(arr2.length)]

console.log(arr1, arr2);

Примечание. Формат вывода похож на предыдущий, который вы опубликовали в первый раз.

0 голосов
/ 13 апреля 2020

Вот быстрое решение, о котором я мог подумать,

let A = [{
    id: 343,
    name: 'Apple',
    selectOrder: 0
  },
  {
    id: 423,
    name: 'Banana',
    selectOrder: 2
  },
  {
    id: 234,
    name: 'Cat',
    selectOrder: 3
  },
  {
    id: 543,
    name: 'Dog',
    selectOrder: 1
  },
  {
    id: 432,
    name: 'Elephant',
    selectOrder: 1
  },
  {
    id: 545,
    name: 'Father',
    selectOrder: 0
  },
];

const tracker = {};

A.forEach((el, i) => {
  if (!tracker[el.selectOrder]) {
    tracker[el.selectOrder] = {
      index1: i
    };
  } else {
    tracker[el.selectOrder].index2 = i;
  }
});

const Arr1 = [];
const Arr2 = [];

for (let selectOrder of Object.values(tracker)) {
  Arr1.push(selectOrder.index1);
  if (selectOrder.index2) {
    Arr2.push(selectOrder.index2);
  } else {
    Arr2.push(selectOrder.index1);
  }
}

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