2017-04-10 52 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] 
}