javascript合并两个json对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript合并两个json对象相关的知识,希望对你有一定的参考价值。

两个JSON对象,如何合并成一个,直接合并,不用考虑有没有重复项。
小程序中使用的,别用eval之类的。
已经找到两种简单可行的方法
1、
for (var i = 0; i < json2.length; i++)
json1.push(json2[i]);

2、
let json3= json1.concat(json2)

参考技术A <script>
function extend(des, src, override)
   if(src instanceof Array)
       for(var i = 0, len = src.length; i < len; i++)
            extend(des, src[i], override);
   
   for( var i in src)
       if(override || !(i in des))
           des[i] = src[i];
       
    
   return des;

var a ="a":"1","b":"2"
var b ="c":"3","d":"4","e":"5"
var c = extend(, [a,b]);
</script>

这个算是比较好理解的了。

如何根据javascript中的键合并和替换两个数组中的对象?

【中文标题】如何根据javascript中的键合并和替换两个数组中的对象?【英文标题】:How to merge and replace objects from two arrays based on a key in javascript? 【发布时间】:2019-06-16 17:01:01 【问题描述】:

我有两个数组对象(arrayList1,arrayList2)。只是我试图将这两个数组合并到一个数组对象中。 我使用了以下术语。

两个数组合并为一个基于键名的数组是type。 arrayList2 的值将被 arrayList1 覆盖。 我得到了预期的输出,但我很担心效率和性能的方式..

有人可以简化我的代码吗..

注意:

如果使用 Array.reduce 函数并且不使用任何插件/库,那就太好了.. 我添加了简单的输入以便理解。元素顺序将发生变化,两个数组的大小都会发生变化。

const arrayList1 = [
     type: "A", any: 11, other: "ab", props: "1" ,
     type: "B", any: 22, other: "bc", props: "2" , // same type
     type: "C", any: 33, other: "df", props: "3" 
];
 
const arrayList2 = [
     type: "D", any: 44, other: "aa", props: "11" ,
     type: "B", any: 22, other: "bb", props: "2----2" , x: 10, // same type
     type: "E", any: 44, other: "cc", props: "33" 
];

result = arrayList2.reduce(function (arr1, arr2) 
  let isMatchFound = false;
  arr1.forEach(function (list) 
    if (arr2.type == list.type) 
      list = Object.assign(list, arr2);
      isMatchFound = true;
    
  );
  if (!isMatchFound) 
    arr1.push(arr2);
  
  return arr1;
, arrayList1);

console.log('result', JSON.stringify(result));

【问题讨论】:

您希望输出是什么? result 应该是什么? 这里的use case 是什么。 list 1list 2 的典型大小是多少?他们总是平等的吗?在出现问题之前,我不会太担心性能。当代码库很大时,瓶颈通常在其他地方。这些天机器可以非常有效地处理loops等。 @JackBashford - 我得到了预期的输出。只是想以高效和性能的方式减少代码。 @SamuelToh,'list-1' 和 'list-2' 的大小将会改变.. 大多数情况下,list1 和 list2 的格式会有所不同。只是我添加了 smaple json 以供理解... @RSKMR 元素的顺序是否固定,即 arrayList1 的第一个元素,然后是 arrayList2? 【参考方案1】:

您也可以使用.reduce()Object.values() 方法来获得所需的输出:

const arrayList1 = [
     type: "A", any: 11, other: "ab", props: "1" ,
     type: "B", any: 22, other: "bc", props: "2" , // same type
     type: "C", any: 33, other: "df", props: "3" 
];
 
const arrayList2 = [
     type: "D", any: 44, other: "aa", props: "11" ,
     type: "B", any: 22, other: "bb", props: "2----2" , x: 10, // same type
     type: "E", any: 44, other: "cc", props: "33" 
];

const result = Object.values(
   [].concat(arrayList1, arrayList2)
     .reduce((r, c) => (r[c.type] = Object.assign((r[c.type] || ), c), r), )
);
                 
console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

由于 Object.values does not guarantee to come in any particular order 我建议使用 Map 代替:[ ...[] .concat(arrayList1, arrayList2) .reduce((r, c) =&gt; r.set(c.type, Object.assign(r.get(c.type) || , c)), r, new Map()) .values(), ];【参考方案2】:

您可以使用reduceObject.values 执行类似的操作

const array1 = [
     type: "A", any: 11, other: "ab", props: "1" ,
     type: "B", any: 22, other: "bc", props: "2" , // same type
     type: "C", any: 33, other: "df", props: "3" 
];
 
const array2 = [
     type: "D", any: 44, other: "aa", props: "11" ,
     type: "B", any: 22, other: "bb", props: "2----2" , x: 10, // same type
     type: "E", any: 44, other: "cc", props: "33" 
];

const mapped = array1.reduce((a,t)=> (a[t.type] = t, a), ),
      mapped2 = array2.reduce((a,t)=> (a[t.type] = t, a), )

console.log(Object.values(...mapped, ...mapped2))

【讨论】:

查看 Mohammad Usman 回答的评论; Object.values 中不保证顺序,所以如果顺序很重要并且您希望它得到保证,那么最好使用 Map。【参考方案3】:

如果你只是想让你的代码更小:

const arrayList1 = [
     type: "A", any: 11, other: "ab", props: "1" ,
     type: "B", any: 22, other: "bc", props: "2" , // same type
     type: "C", any: 33, other: "df", props: "3" 
];
 
const arrayList2 = [
     type: "D", any: 44, other: "aa", props: "11" ,
     type: "B", any: 22, other: "bb", props: "2----2" , x: 10, // same type
     type: "E", any: 44, other: "cc", props: "33" 
];

result = arrayList2.reduce(function(arr1, arr2) 
  if (arr1.find(( type ) => type == arr2.type)) 
    arr1[arr1.indexOf(arr1.find(( type ) => type == arr2.type))] = Object.assign(arr1.find(( type ) => type == arr2.type), arr2);
    arr1.push(arr2);
  
  return arr1;
, arrayList1);

console.log('result', JSON.stringify(result));

【讨论】:

未达到预期输出。请检查我有问题的输出。【参考方案4】:

如果您在 arrayList2 之前并不完全需要 arrayList1,您可以使用这种简单的方法。 我所做的是我已经解构了 arrayList2 的所有元素,并且只有 arrayList1 的键不存在于 arrayList1 中的那些元素。

附: reduce 的问题是你必须减少最大的数组,否则你会错过更大数组的元素。

const arrayList1 = [
     type: "A", any: 11, other: "ab", props: "1" ,
     type: "B", any: 22, other: "bc", props: "2" , // same type
     type: "C", any: 33, other: "df", props: "3" 
];
 
const arrayList2 = [
     type: "D", any: 44, other: "aa", props: "11" ,
     type: "B", any: 22, other: "bb", props: "2----2" , x: 10, // same type
     type: "E", any: 44, other: "cc", props: "33" 
];
const output = [...arrayList2, ...arrayList1.filter(el1 => !arrayList2.some(el2 => el2.type === el1.type))]
//[].concat(arrayList2, arrayList1.filter(el1 => !arrayList2.some(el2 => el2.type === el1.type)))

console.log(output)

【讨论】:

以上是关于javascript合并两个json对象的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序合并两个json对象

JQuery使用JQuery 合并两个 json 对象

如何合并两个 JSON 文件? [复制]

工具Json.NET更新:对合并对象依赖注入F#以及JSONPath的支持

js解析与序列化json数据(一)json.stringify()的基本用法

在 Java 中使用 Gson 合并/扩展 JSON 对象