【问题标题】:How to compare two arrays of objects and only remove items from 1st array if 2nd arrays item value says so如何比较两个对象数组,如果第二个数组项值这么说,则仅从第一个数组中删除项
【发布时间】:2020-09-30 05:02:48
【问题描述】:

我正在尝试通过比较 2 个现有对象来创建一个新的对象数组。我只想返回通过 if 语句的项目。

我希望这种情况发生: 如果 addedArray 中的项目名称与 mainArray 中的项目名称匹配,并且“添加”值相同,则将项目返回到新数组,或者如果项目名称不匹配,则将项目添加到新数组中。

如果这没有意义,请看我想要的结果。

这是我现在所拥有的,由于某种原因,新数组仍然包含 addedArray 的所有项。我不明白为什么。

const mainArray = [
    {name: 'item1', added: false},
    {name: 'item2', added: true},
    {name: 'item3', added: false}
]
const addedArray = [
    {name: 'item2', added: true},
    {name: 'item3', added: true},
    {name: 'item5', added: true}
]



let newAddedArray = addedArray.filter((addedItem) => {
        return mainArray.map((mainItem) => {
            if ((addedItem.name === mainItem.name && addedItem.added === mainItem.added) || addedItem.name !== mainItem.name) {
                return {
                    ...addedItem,
                    addedItem
                }
            }
        })
    })


// Result I want
// newAddedArray = [
//  {name: 'item2', added: true},
//  {name: 'item5', added: true}
// ] 

console.log(newAddedArray)

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    OR 中的第二个条件适用于 addedArray 中的所有项目。因此,您会看到结果中的所有项目。

    从您所期望的结果来看,很明显您正在尝试跳过 mainArray 中具有与 addedArray 中的值不匹配的“附加”值的任何项目。试试下面的

    addedArray.filter(function(addedItem){
        const itemFromMain = mainArray.find(function(mainItem){
            return mainItem.name === addedItem.name;
        });
        // If mainItem is found and 'added' matches or if mainItem is not found, accept it
        if(!itemFromMain || (itemFromMain && itemFromMain.added === addedItem.added)) return true;
        return false;
    });
    

    请注意,IE 不支持 Array 上的“find”方法。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

    编辑:你也可以有这个条件来简化

    if(itemFromMain && itemFromMain.added !== addedItem.added) return false;
    return true;
    

    【讨论】:

      【解决方案2】:

      尝试如下,

      let newAddedArray = [];
          mainArray.forEach((main) => {
              newAddedArray = addedArray.filter((added) => {
                  return ((added.name === main.name && added.added === main.added) || added.name !== main.name);
              });
          });
      
      

      【讨论】:

        【解决方案3】:

        你可以使用数组.some 这个,修改你的过滤函数:

        const mainArray = [
            {name: 'item1', added: false},
            {name: 'item2', added: true},
            {name: 'item3', added: false}
        ]
        const addedArray = [
            {name: 'item2', added: true},
            {name: 'item3', added: true},
            {name: 'item5', added: true}
        ]
        
        
        let newAddedArray = addedArray.filter(item => {
          const { name, added } = item;
          return mainArray.some(arr => arr.added && added && arr.name == name) || 
          !mainArray.some(arr => arr.name === name)
        })
        
        console.log(newAddedArray)

        【讨论】:

          猜你喜欢
          • 2016-12-19
          • 2023-03-09
          • 2017-08-08
          • 1970-01-01
          • 2021-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多