【问题标题】:Find and delete a json object from JSON array从 JSON 数组中查找并删除一个 json 对象
【发布时间】:2017-09-05 03:06:27
【问题描述】:

我有一个类似下面的 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
        }
      ]
    }

现在,当套接字断开连接时,我想从该用户的数组中删除该套接字对象。现在我写了一个函数来从 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 数组的键名,当我得到键名时,我会将它传递给 cleaner function。 但是我不知道如何找到JSON数组的键名。

【问题讨论】:

  • 也许你可以使用一些正则表达式来找到它并用''(空)替换它。不确定这是否是正确的做法,但肯定会有效。
  • cur.id === uniqueId id 属性来自哪里,uniqueId 是什么?
  • 函数中传入的socket id。我已经编辑了这个问题。对不起。
  • @shahakshay94 但curr 仍然没有id 属性

标签: javascript arrays json sockets


【解决方案1】:

使用给定的结构,您需要遍历对象的键,然后遍历其中的数组。

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 = { 'abc@xyz.in': [ { 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; }

【讨论】:

  • 您的答案非常好,但是在套接字 ID 相同但 community_id 不同的情况下会发生什么。我对此进行了测试,但是当我使用 .some() 时,它会在找到所需的 socket.id 后立即返回。 var users = { 'abc@xyz.in': [ { socket_id: '4MIPKfkcitCV9xp6AAAA', community_id: 8 }, { socket_id: '4MIPKfkcitCV9xp6AAAA', community_id: 9 } ] } 在这种情况下,两个对象都应该被删除并且 'abc@ xyz.in' 应该是一个空数组。我们如何在 .some 函数中做到这一点。
  • @shahakshay94,您需要一种不同的方法,因为第一种方法只查找一个 id,而不是多个。第二个创建一个新结果集并检查长度,如果不同,则将新结果集分配给属性。
  • 如何让它递归。我添加了清洁器(用户,socket.id);在 if 语句中并删除了 return true 语句。它工作正常,但它是否适合此问题?
  • 数据结构在我看来不是递归的。
【解决方案2】:

试试这个(用你的 for 循环替换它):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    相关资源
    最近更新 更多