【问题标题】:Create new array based on comparison between two array of objects根据两个对象数组之间的比较创建新数组
【发布时间】:2021-10-05 08:18:06
【问题描述】:

假设我有两个 Object 数组,

let oldBookDetails = [
    {'name':'Harry pottar','amount':10, is_modified: false},
    {'name':'LOTR','amount':20, is_modified: false},
    {'name':'dune','amount':15, is_modified: false}
]

let newBookDetails = [
    {'name':'Harry pottar','amount':15},
    {'name':'LOTR','amount':20},
    {'name':'HR','amount':15}
]

let bookModified = []

我想通过比较 newBookDetails 和 oldBookDetails 来创建新的 Object 数组,

并检查是否有任何名称被删除 newDetails,不要推入 bookModified 数组,

如果数量已更改,则使用 is_modified: true 将 newBookDetails 对象推入 bookModified,如果 newBookDetails 数量相同,则使用 is_modified:false 推入 bookModified 数组。

为此,我尝试如下:

newBookDetails.forEach((el) => {

    oldBookDetails.forEach((ele) => {

        if(Object.values(el).indexOf(el.name) > -1) {
            if(el.amount === ele.amount) {
                bookModified.push(el)
            }else if(el.amount != ele.amount) {
                el.is_modified = true
                bookModified.push(el)
            }
        } else if(Object.values(el).indexOf(el.name) === -1) {
            //this loops as all are not equal....i am stuck from this part.
        }
    })
})

预期的 O/P:

console.log(newBookDetails)

[
    {'name':'Harry pottar','amount':15, is_modified: true},
    {'name':'LOTR','amount':20, is_modified: false},
    {'name':'HR','amount':15, is_modified: true}
]

如果有人需要任何进一步的信息,请告诉我。

【问题讨论】:

  • Object.values(el).indexOf(el.name) > -1 正在检查当前的 el 对象是否具有位于 el 中的名称属性值 - 这将永远是正确的,因为您正在从对象中获取值,并且然后检查该值是否在同一个对象中。您可能想要比较两个对象的名称:ele.name === el.name。你的else if 也可以变成else(甚至完全删除)

标签: javascript node.js arrays


【解决方案1】:

您可以使用map() 和find() 来做到这一点:

ma​​p() 在第二个数组上并尝试使用属性名称在第一个数组中find。 如果没有找到传入修改的true,否则检查金额并相应地传递修改的值。

let oldBookDetails = [
  { 'name': 'Harry pottar', 'amount': 10, is_modified: false },
  { 'name': 'LOTR', 'amount': 20, is_modified: false },
  { 'name': 'dune', 'amount': 15, is_modified: false }
];

let newBookDetails = [
  { 'name': 'Harry pottar', 'amount': 15 },
  { 'name': 'LOTR', 'amount': 20 },
  { 'name': 'HR', 'amount': 15 }
];

let bookModified = newBookDetails.map((x) => {
  let foundBook = oldBookDetails.find(old => old.name === x.name);
  if (foundBook) {
    if (foundBook.amount !== x.amount)
      return { ...x, is_modified: true };
    else
      return { ...x, is_modified: false };
  }
  else
    return { ...x, is_modified: true };
});
console.log(bookModified);

【讨论】:

  • 我的解决方案:jsfiddle.net/1zLtu9qc
  • 使用... 运算符编辑了答案。错过了那部分
  • 实际上我还有一个查询应该问新问题还是可以在同一个问题中更新。:: 我的查询::创建一个变量字符串以记录金额是否减少或增加或删除和哪本书。例如:“所有者删除了书沙丘”
  • @SushantRad 查看我的分析器进行检查。我也合作过。
【解决方案2】:

Array.map 将帮助您根据需要生成新数组。

逻辑

  • 循环遍历newBookDetails 数组。
  • 检查来自newBookDetails 的节点是否存在于oldBookDetails
  • 如果没有返回带有is_modified 的newBook 节点为true
  • 如果是。返回具有is_modified 值的节点作为比较新书和旧书价格的布尔值。
  • 要找到删除的书,过滤oldBookDetails数组并检查newBookDetails中不存在的节点

const oldBookDetails = [ {'name':'Harry pottar','amount':10, is_modified: false}, {'name':'LOTR','amount':20, is_modified: false}, {'name':'dune','amount':15, is_modified: false}];
const newBookDetails = [ {'name':'Harry pottar','amount':15}, {'name':'LOTR','amount':20}, {'name':'HR','amount':15} ];
const bookModified = newBookDetails.map((node) => {
  const oldBookNode = oldBookDetails.find((item) => item.name === node.name);
  if (oldBookNode) {
    return { ...node, is_modified: oldBookNode.amount !==  node.amount }
  } else {
    return { ...node, is_modified: true };
  }
});
const removedBooks = oldBookDetails.filter((book) => !newBookDetails.find((node) => node.name === book.name));
console.log(bookModified);
console.log(removedBooks);

【讨论】:

  • 为什么这被否决了?
【解决方案3】:

你可以用下面的sn-p做

newBookDetails.forEach(newBook => {
  let found = false;
  oldBookDetails.forEach(oldBook => {
    if (oldBook.name === newBook.name) {
      if (oldBook.amount === newBook.amount) {
        bookModified.push({
          'name': newBook.name,
          'amount': newBook.amount,
          is_modified: false
        })
      } else {
        bookModified.push({
          'name': newBook.name,
          'amount': newBook.amount,
          is_modified: true
        })
      }
      found = true;
    }
  })
  if (!found) {
    bookModified.push({
      'name': newBook.name,
      'amount': newBook.amount,
      is_modified: true
    })
  }
})

【讨论】:

【解决方案4】:

let oldBookDetails = [
    {'name':'Harry pottar','amount':10, is_modified: false},
    {'name':'LOTR','amount':20, is_modified: false},
    {'name':'dune','amount':15, is_modified: false}
]

let newBookDetails = [
    {'name':'Harry pottar','amount':15},
    {'name':'LOTR','amount':20},
    {'name':'HR','amount':15}
]

let bookModified = oldBookDetails
  .filter((oldBookDetail) => newBookDetails.findIndex((bookDetails) => bookDetails.name === oldBookDetail.name) > -1)
  .map((oldBookDetails) => {
  const newDetails = newBookDetails.find((bookDetails) => bookDetails.name === oldBookDetails);
  return {...oldBookDetails, ...newDetails};
});

console.log(bookModified);

如果您花更多时间在优化和锐化上,可以做得更好

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-05-18
  • 2014-04-03
  • 2021-12-25
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多