Объединить массивы из одного массива в JavaScript - PullRequest
0 голосов
/ 11 октября 2019

У меня есть такой массив:

[
  {
    "id": 10002,
    "flag": false,
    "list": [
      "aaa",
      "bbb"
    ]
  },
  {
    "id": 10001,
    "flag": true,
    "list": [
      "10002",
      "10003"
    ]
  },
  {
    "id": 10003,
    "flag": false,
    "list": [
      "ccc",
      "ddd"
    ]
  }
]

Я попробовал это изначально, у меня есть значение "10001", поэтому итерируйте этот массив, чтобы получить массив "list", если flag == true, затем сохранен в newarray. но это не работает.

Я хочу, чтобы это было так: [ "aaa", "bbb", "ccc", "ddd" ].

Ответы [ 4 ]

2 голосов
/ 11 октября 2019

Если я правильно понимаю, это то, что вы хотите:

const someArray = [
  {
    "id": 10001,
    "list": [
      "10002",
      "10003"
    ]
  },
  {
    "id": 10002,
    "list": [
      "aaa",
      "bbb"
    ]
  },
  {
    "id": 10003,
    "list": [
      "ccc",
      "ddd"
    ]
  }
];

const [head,...rest] = someArray;
const result = head.list.reduce((acc,currentId)=>acc.concat(rest.find(({id})=> id === parseInt(currentId)).list),[]);

Вот jsFiddle https://jsfiddle.net/sudakatux/9hju85mt/22/

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

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

rest.find(({id})=> id === parseInt(currentId)).list

будет выглядеть как

rest.find(({id})=> id === parseInt(currentId)) || {list:[]}).list

Что в основном означает, что если его неопределенное значение возвращает объект с пустым списком, то он объединит пустой список, что приведет кв том же списке. (например, умножение на 1 при умножении)

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ после редактирования.

Если ваш массив находится в другом порядке, вам нужно найти диктонар итогда логика будет такой же

  const [newHead] = otherArray.filter(({list}) => list.every(elem=>!isNaN(elem)));

    const result2 = newHead.list.reduce(
    (acc,currentId) =>acc.concat(otherArray.find(({id})=> id === parseInt(currentId)).list),[]);

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

const [newHead] = otherArray.filter(({flag}) => flag));

(обратите внимание *, что вместо использования остальных я использовал полный массив (otherArray)., так как я нацелен на равенство. Я использую фильтр иИзвлечение первого элемента результата. Потому что я учитываю возможность того, что в будущем у вас может быть более одного «словарного элемента». Если это так в будущем, то вам просто нужно объединить списки из результата фильтрации

1 голос
/ 11 октября 2019

const array = [
  {
    id: 10001,
    flag: true,
    list: ["10002", "10003"]
  },
  {
    flag: false,
    id: 10002,
    list: ["aaa", "bbb"]
  },
  {
    flag: false,
    id: 10003,
    list: ["ccc", "ddd"]
  }
];

const isHead = item => item.flag && item.id === 10001;

const head = array.find(isHead);

const rest = array.filter(item => !isHead(item));

const result = rest
  .flatMap(item =>
    head.list.includes(item.id.toString()) && item.list
  );

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

Вы можете выбрать значения списка первого объекта в массиве как arr[0]['list'] Как только у вас есть эти значения (10002,10003), вы можете получить значения списка оставшихся объектов в массиве, чей ключ идентификатора соответствует одному извышеуказанные значения.

if(arr[i]['id'] == 10002 || arr[i]['id'] == 10003){
//fetch the list values
}
0 голосов
/ 11 октября 2019

Вы можете отобразить список первого элемента и объединить все списки из этих идентификаторов.

const mapItems = (input) => {
  const source = input[0].list;
  source.reduce((results, id) => {
    return results.concat(input.find(item => item.id === id).list);
  }, []);
};

mapItems([
  {
    "id": 10001,
    "list": [
      "10002",
      "10003"
    ]
  },
  {
    "id": 10002,
    "list": [
      "aaa",
      "bbb"
    ]
  },
  {
    "id": 10003,
    "list": [
      "ccc",
      "ddd"
    ]
  }
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...