【问题标题】:Merging JavaScript JSON objects with matching parms将 JavaScript JSON 对象与匹配的参数合并
【发布时间】:2019-09-14 21:32:01
【问题描述】:

我很难找到“合并”两个 JSON 对象的解决方案。我找不到任何有帮助的答案。我有两个对象并想比较它们,如果匹配,则将属性作为标记添加到第一个对象。这是一个例子:

小提琴:https://jsfiddle.net/aunzyfcj/

第一个输入对象:

    var firstInput = [{
        "id": "43", 
        "published": "yes", 
        "publish_date": "20.08.2019"

      }, {
        "id": "44",
        "published": "yes", 
        "publish_date": "20.08.2019"         
     }]

第二个输入对象:

    var secondInput = [{
        "id": 92,
        "id_artikla": "140"
    }, {
        "id": 93,
        "id_artikla": "139"
    }, {
        "id": 94,
        "id_artikla": "44"
    }, {
        "id": 95,
        "id_artikla": "10"
    }, {
        "id": 96,
        "id_artikla": "12"
    }, {
        "id": 97,
        "id_artikla": "22"
    }, {
        "id": 98,
        "id_artikla": "9"
    }]  

我想检查firstInput 中的"id": "44" 对象是否存在于secondInput 对象的“列表”中,并创建第三个output 对象与(相同长度)firstInput 的副本。但是这次添加了属性"status": "SAVED" 如果"id": "44" 存在于 secondInput 中为"id_artikla": "44"

如果没有匹配,我想添加属性"status": "SAVE_ME"。 请看下面的输出示例。

输出对象:

     var output =  [{
        "id": "43", 
        "published": "yes", 
        "publish_date": "20.08.2019",
        "status": "SAVE_ME"
      }, {
        "id": "44",
        "published": "yes", 
        "publish_date": "20.08.2019",
        "status": "SAVED"
     }]

我尝试使用下面的代码,但它没有给我想要的输出。它只添加一个匹配的 id。

            let i = 0;
            firstInput.forEach( function( item ) {         
                 var artikal = item.id; 
                 secondInput.forEach( function( data ) { 
                        if(artikal === data.id_artikla){  
                            firstInput[i].status = "SAVED";  
                        } else { 
                            firstInput[i].status = "SAVE_ME";
                        } 
                     }); 
                i++;
            });

有谁知道如何使用纯香草 JS 获得所需的输出? - 注意:该列表有 100 多个索引。速度至关重要。

【问题讨论】:

  • 从技术上讲,JSON 是指您序列化了一个 javascript 对象。因此,您使用的是 javascript 对象,而不是 json。

标签: javascript arrays json object nativescript


【解决方案1】:

如果两个列表都很大,您可能希望避免将第一个列表中的每个项目与第二个列表中的每个项目进行比较的嵌套循环,因为这相当于 O(n^2) 比较。

相反,我会将secondList 转换为支持通过 id 进行高效查找的数据结构:

const articleSaved = {};
for (const item of secondInput) {
    articleSaved[item.id_artikla] = true;
}
for (const item of firstInput) {
    item.status = articleSaved[item.id] ? 'SAVED' : 'SAVE_ME';
}

请注意,这会修改现有对象。如果你想要新的对象,你可以这样做

const result = firstInput.map(item => Object.assign({}, item, {status: saved[item.id] ? 'SAVED' : 'SAVE_ME'}));

【讨论】:

  • 大家感谢所有回复。我现在就试试这个,让你知道它是怎么回事。更新:此解决方案完美运行。当我仔细观察时,它确实更有意义。谢谢你的帮助,干杯@meriton
【解决方案2】:

您是否尝试过使用Array.prototype.find()?这应该是一个解决方案。 Check this out

【讨论】:

  • 用我拥有的这个数组来实现对我来说看起来更复杂。但谢谢你的想法。
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 2016-03-16
  • 1970-01-01
  • 2015-12-11
  • 2022-11-23
  • 2018-10-21
  • 1970-01-01
  • 2020-09-12
相关资源
最近更新 更多