比较两个数组中的对象javascript任何追加缺失

时间:2019-05-20 19:39:17

标签: javascript arrays json

我正在尝试执行一些JSON函数,在这里我需要比较array1和array2中的对象,如下所示,并将缺少的对象附加到array2或完全创建一个newArray1。

这是示例

const array1 = [
   {
      "document_id":"ABC123",
      "document_title":"How to solve a Status",
   },
   {
      "document_id":"ABC678",
      "document_title":"Make it Status two",
   },
  {
      "document_id":"ABC678",
      "document_title":"Make it Status two",
   }
];

const array2 = [
   {
      "article_id":"ABC123",
      "rank":0
   },
   {
      "article_id":"ABC678",
      "rank":1
   }
]

const resultOutput = [{
      "article_id":"ABC123",
      "rank":0,
      "title":"How to solve a Status",
   },
   {
      "article_id":"ABC678",
      "rank":1,
      "title":"Make it Status two",
   }]

2 个答案:

答案 0 :(得分:0)

您可以使用嵌套的for这样的循环...

const resultOutput = [];

for(let i = 0; i < array2.length; i++) {
    let currentObj = array2[$i];

    for(let j = 0; j < array1.length; j++) {
        if(currentObj.article_id === array1[j].document_id) {
            let tempObj = {
                "article_id": currentObj.article_id,
                "rank": currentObj.rank,
                "title": array1[j].document_title
            };

            resultOutput.push(tempObj);
        }
    }
}

答案 1 :(得分:0)

这是一种方法。 (代码段下方的详细说明。)

const array1 = [
  {
    "document_id":"ABC123",
    "document_title":"How to solve a Status",
  },
  {
    "document_id":"ABC678",
    "document_title":"Make it Status two",
  },
  {
    "document_id":"ABC678",
    "document_title":"Make it Status two",
  }
];

const array2 = [
  {
    "article_id":"ABC123",
    "rank":0
  },
  {
    "article_id":"ABC678",
    "rank":1
  }
];

const mergedMap = ([...array1, ...array2])
.reduce(
  (acc, {document_id, article_id = document_id, ...others}) => {
    acc[article_id] = {...(acc[article_id] || {article_id}), ...others};
    return acc;
  },
  {}
);

console.log(Object.values(mergedMap));

使用array1和array2中的所有条目创建一个新数组。

[...array1, ...array2]

在合并的数组上运行Array.reduce

[...array1, ...array2].reduce(
  // function,
  // initial value
)

Array.reduce的第一个参数是为数组中的每个项目调用的函数。它有4个参数,但我们只关心前两个:

  1. 上一次迭代(累加器)返回的值
  2. 当前数组条目。

我们在第二个参数(当前数组条目)上使用object destructuring syntax来获取article_id,并将其默认设置为document_id,并将其余项的属性捕获为{ {1}}。

others

将当前项目的属性合并到其(acc, {document_id, article_id = document_id, ...others}) => { 的累加器条目中,并根据需要通过article_id创建该条目:

{article_id}

为下一次迭代返回更新的累加器:

acc[article_id] = {...(acc[article_id] || {article_id}), ...others};

该reduce调用的最终结果将是return acc; 到合并对象的映射:

article_id

我们不再关心该对象中的键,因此我们将值提取为数组:

{
  ABC123: {
    article_id: 'ABC123',
    rank: 0,
    title: 'How to solve a Status',
  },
  ABC678: {
    article_id: 'ABC678',
    document_title: 'Make it Status two',
    rank: 1
  }
}

哪个获取了我们的对象数组:

Object.values(mergedMap);