首页 > 解决方案 > 比较对象数组并删除特定项目

问题描述

arr1 = [
    {
        name: "will",
        value: "1"
    },
    {
        name: "nelson",
        value: "3"
    }
];

arr2 = [
    {
        name: "will",
        value: 1,
        submenu: [
            {
                name: "ralph",
                value: 2    
            }
        ]
        }
]

然后从第二个数组中删除 ralph。我已经创建了一个执行此操作的函数,但只检查第一个元素而不验证子菜单。

comparador(arrSecundario) {
    return (arrAtual) => {
      return arrSecundario.filter(function (other) {
        return other.value === arrAtual.value;
      }).length !== 0;
    };
  }

this.arr2.filter(this.comparador(this.arr1));

标签: javascriptarrayscomparison

解决方案


过滤后需要映射数组。您可以这样做,也可以添加“prop === 'submenu'” 来专门检查子菜单内部数组。

var arr1 = [
  {
    name: "will",
    value: "1"
  },
  {
    name: "nelson",
    value: "3"
  }
];

var arr2 = [
  {
    name: "will",
    value: 1,
    submenu: [
        {
          name: "ralph",
          value: 2    
        },
        // {
        //   name: "nelson",
        //   value: 3
        // }
    ]
  }
];

function filterComparador(arrSecundario) {
  return (arrAtual) => {
    return arrSecundario.filter((other) => {
      return other.value == arrAtual.value;
    }).length != 0;
  };
}

function mapComparador(arrSecundario) {
  return (arrAtual) => {
    Object.keys(arrAtual).forEach((prop) => {
       if (Array.isArray(arrAtual[prop])) {
          let propValue =  arrAtual[prop].filter(this.filterComparador(arrSecundario));
          if (propValue.length > 0) {
            arrAtual[prop] = propValue.map(this.mapComparador(this.arrSecundario));
          } else {
            delete arrAtual[prop]; 
          }           
       }
    });
    return arrAtual;
  };
}

var manipulatedArray = this.arr2.filter(this.filterComparador(this.arr1))
    .map(this.mapComparador(this.arr1));

console.log(manipulatedArray);


推荐阅读