将项目从第一个对象数组推到另一个对象数组

时间:2020-01-31 09:04:41

标签: reactjs react-native react-redux

defaultParameterTypes = [] // this is my empty array



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

当我选中复选框时,我想将对象推入defaultParameterTypes数组,但情况是 重复输入该类型时,请不要再按两次。

"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'}]",

我想创建一个喜欢的循环,并检查是否在defaultEmptyArray中找不到它,如果没有发现则推送它 但我不需要在mydefaultarray

中重复该类型

2 个答案:

答案 0 :(得分:1)

一种简单的方法是创建一个在数组中看到的类型的映射,并将您的输入数组缩小,然后从您创建的映射中获取值的数组。

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);

答案 1 :(得分:0)

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]
 }
}, []);

或如果类型再次出现,则仅复制名称对象。

这将返回一个相同长度的数组,但是沿着元素,如果type属性重复出现,它将被删除...

相关问题