Перенос элементов из первого массива объектов в другой массив объектов - PullRequest
0 голосов
/ 31 января 2020
defaultParameterTypes = [] // this is my empty array



const propsArray = this.props.device.deviceProperties.defaultParameterTypes;      
 const defaultParameterTypes = this.state.deviceSettings.defaultParameterTypes;

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

"propsArray": "[{'name': '1','type': '11'}, {'name': '2','type': '22'}, {'name': '3','type': '11'}, {'name': '4','type': '11'}, {'name': '5','type': '22'}, {'name': '6','type': '22'}, {'name': '7','type': '22'}]",

я хочу сделать как l oop и проверить, не найден ли он в defaultEmptyArray и pu sh, если не найден, но мне не нужно, чтобы тип повторялся в mydefaultarray

Ответы [ 2 ]

1 голос
/ 31 января 2020

Простым способом было бы создать карту типов, видимых в массиве, и уменьшить в нее входной массив, а затем получить массив значений из созданной вами карты.

const data = [
  { name: "1", type: "11" },
  { name: "2", type: "22" },
  { name: "3", type: "11" },
  { name: "4", type: "11" },
  { name: "5", type: "22" },
  { name: "6", type: "22" },
  { name: "7", type: "22" }
];

// reduce array into map of type => { name, type }
// then get the object values array
const reducedData = Object.values(
  data.reduce((acc, { name, type}) => {
    if (!acc[type]) acc[type] = { name, type }; // if not seen type, store
    return acc;
  }, {})
);

console.log(reducedData)

Раскройте эту концепцию, чтобы создать функцию, которая принимает два массива и обрабатывает второй в первом.

const data = [
  { name: "1", type: "11" },
  { name: "2", type: "22" },
  { name: "3", type: "44" },
  { name: "4", type: "11" },
  { name: "5", type: "22" },
  { name: "6", type: "33" },
  { name: "7", type: "22" }
];

const data2 = [
  { name: "1", type: "33" },
  { name: "2", type: "22" },
  { name: "3", type: "66" },
  { name: "4", type: "11" },
  { name: "5", type: "22" },
  { name: "6", type: "44" },
  { name: "7", type: "22" }
];

const data3 = [
  { name: "1", type: "66" },
  { name: "2", type: "22" },
  { name: "3", type: "33" },
  { name: "4", type: "11" },
  { name: "5", type: "55" },
  { name: "6", type: "11" },
  { name: "7", type: "44" }
];

const reduceData = (currentArray = [], newArray = []) => {
  const mapFn = (acc, { name, type }) => {
    if (!acc[type]) acc[type] = { name, type }; // if not seen type, store
    return acc;
  };
  const createMap = array => array.reduce(mapFn, {});

  return Object.values(newArray.reduce(mapFn, createMap(currentArray)));
};

const reducedData = reduceData(data, data2);
const reducedData1 = reduceData(reducedData, data3);

console.log(reducedData);
console.log(reducedData1);
0 голосов
/ 31 января 2020
let hasValue = (arr, obj) => arr && arr.filter(item => item.type == obj.type).length

let result = propsArray.reduce((acc, curr) => {
 if (hasValue(acc, curr)) {
  return acc;
 } else {
  return [...acc, curr]
 }
}, []);

даст вам массив со всеми элементами, где свойство type уникально ..

надеюсь, что это именно то, что вы ожидаете получить ..

let result = propsArray.reduce((acc, curr) => {
 if (hasValue(acc, curr)) {
  return [...acc, { name: curr.name }];
 } else {
  return [...acc, curr]
 }
}, []);

или если тип повторяется, копируется только имя объекта ..

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

...