【问题标题】:How to merge two objects (associative array) with same key into one object如何将具有相同键的两个对象(关联数组)合并为一个对象
【发布时间】:2017-12-02 19:48:17
【问题描述】:

我有两个对象:

var arr= [
  0: { selectedAns: "test answer 1", id: "28", status: "answered" }
]

和:

var answerList = [
  0: { selectedAns: "test answer 2 ques 5", id: "27", status: "answered" },
  1: { selectedAns: "test answer 3 ques 6", id: "29", status: "answered"}
]

当我这样做时:

arr1.push(arr);
arr1.push(answerList);

我得到了这个结果:

var arr1=[0:{
    0:{selectedAns: "test answer 2 ques 5", id: "27", status: "answered"}
}
1:{
    0:{selectedAns: "test answer 1", id: "28", status: "answered"}
    1:{selectedAns: "test answer 3 ques 6", id: "29", status: "answered"}
}]

但我想要这样的东西:

    var arr1=[
    0:{selectedAns: "test answer 2 ques 5", id: "27", status: "answered"}

    1:{selectedAns: "test answer 1", id: "28", status: "answered"}

    2:{selectedAns: "test answer 3 ques 6", id: "29", status: "answered"}
]

我做错了什么?谢谢。

注意:在合并两个对象之前,我会从对象中删除重复项,即使任何键在状态键中都具有重复值。不过,我需要合并这两个对象。根据我的要求,只有 id 键需要是唯一的,所以我需要一种方法来合并上面的两个对象。

【问题讨论】:

  • 去掉所有 0:1: 等显示的语法......这些都不是有效的语法。对象数组看起来像 [{},{},{}]
  • 看起来你有两个数组,arranswerList。然后你尝试解决一个叫做arr1的东西。这是什么?
  • arr1 是一个变量,我试图在合并 arr 和 answerList 后存储结果。@Roamer-1888
  • 为什么是数组。为什么不简单地处理原生 js 对象呢?

标签: javascript arrays


【解决方案1】:

您可以使用Array#concat,这需要分配新数组。

var arr = [{ selectedAns: "test answer 1", id: "28", status: "answered" }],
    answerList = [{ selectedAns: "test answer 2 ques 5", id: "27", status: "answered" }, { selectedAns: "test answer 3 ques 6", id: "29", status: "answered" }];
    
arr = arr.concat(answerList);

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

或者使用Array#pushFunction#apply 将数组作为参数。

var arr = [{ selectedAns: "test answer 1", id: "28", status: "answered" }],
    answerList = [{ selectedAns: "test answer 2 ques 5", id: "27", status: "answered" }, { selectedAns: "test answer 3 ques 6", id: "29", status: "answered" }];
    
Array.prototype.push.apply(arr, answerList);

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

使用 ES6,您可以使用 spread syntax ... 推送值,它以数组作为参数。

var arr = [{ selectedAns: "test answer 1", id: "28", status: "answered" }],
    answerList = [{ selectedAns: "test answer 2 ques 5", id: "27", status: "answered" }, { selectedAns: "test answer 3 ques 6", id: "29", status: "answered" }];
    
arr.push(...answerList);

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • @M0ns1f,索引不是 javascript 中数组的有效部分。我认为这只是在控制台中显示数组的一部分。
  • 好吧,如果他想使用索引,请查看我的答案并给我您的意见^^'
  • @NinaScholz 感谢您如此迅速地回复...您救了我的命,arr = arr.concat(answerList);再次感谢我的工作......
【解决方案2】:

使用 javascript,您可以使用 for 循环将 answerList 数组推送到 arr1,请参阅此函数:

var arr1 = [];
var arr={0:{selectedAns: "test answer 1", id: "28", status: "answered"}};

var answerList={0:{selectedAns: "test answer 2 ques 5", id: "27", status: "answered"},1:{selectedAns: "test answer 3 ques 6", id: "29", status: "answered"}};

arr1.push(arr);//push first array
pashingarray(answerList);

//function to push an array
function pashingarray(arrtobepush)
{
var lenghtar = 0;
for(var key in arrtobepush) {
    if(arrtobepush.hasOwnProperty(key)){
       lenghtar++;//get the lenght of the array
    }
}
for(var i = 0;i<lenghtar;i++)//loop the array to push the content
{
  var keytopush = i+1;
  var arraytopush = {[keytopush]:arrtobepush[i]};
  arr1.push(arraytopush);
}
}

console.log(arr1);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2023-01-09
    • 2017-09-28
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多