2017-04-10 74 views
2

JSON对象我有一个JSON对象,像下面这样:查找并删除JSON阵列

var users = { 
     ross: [ 
     { 
      socket_id: 'K7XhUcIXAQFkmhK7AAAA', 
      community_id: 2 
     }, 
     { 
      socket_id: 'gWBy0adi2e3KoIWuAAAC', 
      community_id: 2 
     }, 
     { 
      socket_id: 'PRQ2czNZuvatsy8cAAAD', 
      community_id: 2 
     }, 
     { 
      socket_id: 'R-EGVCDc5jWQV50KAAAF', 
      community_id: 2 
     } 
     ], 
     laura: [ 
     { 
      socket_id: 'VCp2NxY42LMNvOclAAAE', 
      community_id: 2 
     }, 
     { 
      socket_id: 'MDZe6Oe8U4xzmUjxAAAG', 
      community_id: 2 
     } 
     ], 
     john: [ 
     { 
      socket_id: 'Omn3VQKyuYHm2JNdAAAH', 
      community_id: 2 
     } 
     ] 
    } 

现在,当插座断开时,我想删除该用户的数组Socket对象。现在我写了一个函数来从Json数组中删除Json对象。

var cleaner= function(arr, id) { 
      for (var i = 0; i < users.length; i++) { 
       var cur = users[i]; 
       if (cur.id === id) { 
        arr.splice(i, 1); 
        break; 
       } 
      } 
     }; 
cleaner(users, socket.id); 

上述功能的唯一问题是我需要传递该JSON数组所属关键字的名称。

基本上,首先我想找到该JSON数组的密钥的名称,当我将得到密钥名称时,我会将它传递给清除函数。 但我不知道如何找到JSON数组的键名。

+0

也许你可以使用一些正则表达式来找到它,并用 ''(emptyness)替换它。不知道这是否是正确的做法,但肯定会有效。 – Xogno

+0

'cur.id === uniqueId'哪里是'id'属性来自哪里,什么是'uniqueId'? – gurvinder372

+0

它是在该函数中传递的套接字标识。我编辑了这个问题。抱歉。 – shahakshay94

回答

2

对于给定的结构,您需要迭代对象的键然后遍历数组中的内部。

var users = { ross: [{ socket_id: 'K7XhUcIXAQFkmhK7AAAA', community_id: 2 }, { socket_id: 'gWBy0adi2e3KoIWuAAAC', community_id: 2 }, { socket_id: 'PRQ2czNZuvatsy8cAAAD', community_id: 2 }, { socket_id: 'R-EGVCDc5jWQV50KAAAF', community_id: 2 }], laura: [{ socket_id: 'VCp2NxY42LMNvOclAAAE', community_id: 2 }, { socket_id: 'MDZe6Oe8U4xzmUjxAAAG', community_id: 2 }], john: [{ socket_id: 'Omn3VQKyuYHm2JNdAAAH', community_id: 2 }] }, 
 
    cleaner = function (object, socket_id) { 
 
     Object.keys(object).some(function (k) { 
 
      return object[k].some(function (a, i, aa) { 
 
       if (a.socket_id === socket_id) { 
 
        aa.splice(i, 1); 
 
        return true; 
 
       } 
 
      }); 
 
     }); 
 
    }; 
 

 
cleaner(users, 'PRQ2czNZuvatsy8cAAAD'); 
 

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

一个以上的删除方法与Array#filter

var users = { '[email protected]': [ { socket_id: '4MIPKfkcitCV9xp6AAAA', community_id: 8 }, { socket_id: '4MIPKfkcitCV9xp6AAAA', community_id: 9 } ] } , 
 
    cleaner = function (object, socket_id) { 
 
     Object.keys(object).forEach(function (k) { 
 
      var temp = object[k].filter(function (a) { 
 
       return a.socket_id !== socket_id; 
 
      }); 
 
      if (object[k].length !== temp.length) { 
 
       object[k] = temp; 
 
      } 
 
     }); 
 
    }; 
 

 
cleaner(users, '4MIPKfkcitCV9xp6AAAA'); 
 

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

+1

你的回答非常好,但是在有相同套接字ID和不同community_id的情况下会发生什么情况。我测试了这个,但是因为我使用了.some(),只要找到想要的socket.id就会返回。 VAR用户= { '[email protected]': [{socket_id: '4MIPKfkcitCV9xp6AAAA',community_id:8},{ socket_id: '4MIPKfkcitCV9xp6AAAA',community_id:9}]} 在这种情况下这两个对象应被删除和'[email protected]'应该是一个空数组。我们如何在一些功能中做到这一点。 – shahakshay94

+1

@ shahakshay94,你需要一个不同的方法,因为第一个只查找一个id,而不是一个。第二个创建一个新的结果集并检查长度,如果不同,则将新结果集分配给该属性。 –

+1

如何递归。我添加了清洁(用户,socket.id);在if语句内部并删除了返回true语句。它工作正常,但它是适当的解决方案吗? – shahakshay94

1

试试这个(与替换这是你的for循环):

for(var i in users) 
{ 
    name = i; 
    array = users[i] 
}