我有两个json数组。 EXP:
$scope.arr1 = [
{ "id": 1, "first_name": "Philip", "last_name": "Kim", "email": "pkim0@mediafire.com", "country": "Indonesia", "ip_address": "29.107.35.8" },
{ "id": 2, "first_name": "Judith", "last_name": "Austin", "email": "jaustin1@mapquest.com", "country": "China", "ip_address": "173.65.94.30" },
{ "id": 3, "first_name": "Julie", "last_name": "Wells", "email": "jwells2@illinois.edu", "country": "Finland", "ip_address": "9.100.80.145" },
{ "id": 4, "first_name": "Gloria", "last_name": "Greene", "email": "ggreene3@blogs.com", "country": "Indonesia", "ip_address": "69.115.85.157" },
{ "id": 5, "first_name": "Andrea", "last_name": "Greene", "email": "agreene4@fda.gov", "country": "Russia", "ip_address": "128.72.13.52" }]
$scope.arr2=[];
我希望根据某些条件按字段将arr1的元素按字段推送到arr2。
var object;
var temp = {};
for (var i in $scope.arr1) {
object = $scope.arr1[i];
for (var property in object) {
temp2 = object.id + '_' + property;
if ($scope.someOtherData.indexOf("unhighlighted") != -1) {
temp[property] = "";
}
else {
temp[property] = object[property];
}
}
$scope.arr2.push(temp);
}
我的第一个问题: 首先将温度推到arr2 OK。但是,当我推动第二个或更多时,arr2中的所有元素都转为最后一个临时值。我可以解决这个问题吗?
我的第二个问题是:我没有将$$ hashKey属性添加到arr1。但它是自发发生的。 我该如何防止这种情况?
答案 0 :(得分:0)
每次迭代都需要一个新对象,然后你不会通过引用更新同一个对象。
现在你要向array2添加几次相同的对象,它实际上是相同的,所以最后你将在数组2中拥有相同对象的几个副本。
//this help you to prevent usage of the same object
var temp = {};
for (var property in object) {
//please add here to not copy something that you don't
if(object.hasOwnProperty(property))
{
...
}
答案 1 :(得分:0)
你需要在for循环之前声明var temp:
for (var i in $scope.arr1) {
object = $scope.arr1[i];
var temp = {}; //<--------here
for (var property in object) {
答案 2 :(得分:0)
问题是因为在JavaScript中objects are passed around by reference
。所以解释你的代码,temp
被全局声明为循环,所以创建一个对象并在循环中指定一些值并将temp推送到数组,所有这些都在第一次正常工作,现在你将temp更新为第二个循环中的新值,在这里你要更新same object
并且你推入数组的对象也是同一个对象,你只是在循环中处理它的引用直到结束,所以这就是原因您在数组中获得相同的值,并且值是最后一个循环的值。您基本上已经将相同的对象多次推入到数组中,并且更新一个将影响所有对象,因为它们都指向同一个对象。
所以这是修复,
1)正如人们已经建议的那样,在每个循环中创建一个新对象。这样在每个循环中,您创建一个新对象,并且没有参考问题。代码是
for (var i in $scope.arr1) {
object = $scope.arr1[i];
var temp = {}; // creating new object in every loop
for (var property in object) {
//your stuff
2)在将对象推入数组之前,先将其复制然后推送,这样就可以一直推送新对象。代码如下所示。
var newObject = Object.clone(temp); // create a new object by cloning
$scope.arr2.push(newObject );