javascript - 过滤对象数组然后替换

标签 javascript

我有一个对象数组,我想过滤,然后返回过滤后的数组,但与另一个数组比较,看是否需要替换它。

比如我想通过category_id = 2过滤allItems,然后根据newItems数组,我想返回过滤后的数组,但更新项位于 newItems 中(如果存在)。

allItems = [
  {
    'id': 1,
    'category_id': 2,
    'text': 'old',
    'child': [
      {
        'id': 2,
        'category_id': 2,
        'text': 'old'
      }
    ]
  },
  {
    'id': 3,
    'category_id': 3,
    'text': 'old'
  }
]


newItems = [
  {
    'id': 2,
    'category_id': 2,
    'text': 'new'
  }
]

所以我想返回:

results = [
  {
    'id': 2,
    'category_id': 2,
    'text': 'new'
  },
  {
    'id': 3,
    'category_id': 2,
    'text': 'old'
  },
]

现在,我有过滤部分,但我不确定如何与另一个数组进行比较并替换为更新后的项目。

return this.allItems.filter( (item) => {
  return item.category_id == 2
})

最佳答案

使用 filter其次是 .map , 用新项目替换项目(如果需要):

const allItems = [
  {
    'id': 1,
    'category_id': 1,
    'text': 'old'
  },
  {
    'id': 2,
    'category_id': 2,
    'text': 'old'
  },
  {
    'id': 3,
    'category_id': 2,
    'text': 'old'
  }
];
const newItems = [
  {
    'id': 2,
    'category_id': 2,
    'text': 'new'
  }
];

const newItemsById = newItems.reduce((a, item) => {
  a[item.id] = item;
  return a;
}, {});

const output = allItems
  .filter(({ category_id }) => category_id === 2)
  .map((item) => newItemsById[item.id] ? newItemsById[item.id] : item);
console.log(output);

另请注意,您的 'id': <number> allItems 中的键值对需要后跟逗号,当后跟另一个键值对时,语法才有效。

关于javascript - 过滤对象数组然后替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858571/

相关文章:

javascript - 在浏览器中找不到 browserify 全局变量

javascript - 从 JSON API 响应获取属性的唯一值计数

javascript - 如何从 JavaScript 中的子类调用父类的方法,以便可以访问父类的局部变量?

Javascript 焦点到文本框

javascript - couchdb 用户管理器 GUI

javascript - 文件未在文件阅读器中上传

javascript - Vuetify 性能问题

javascript - 使用gapi.drive.realtime时是否有使用gapi.auth2进行身份验证的解决方法?

javascript - 为简单的 javascript 打字机添加字体覆盖

javascript - jquery 输入 - 如何正确处理文本更改