【问题标题】:Remove json from another json从另一个 json 中删除 json
【发布时间】:2018-10-09 14:27:21
【问题描述】:

我有两个 JSON,具有不同的结构,我需要从另一个中删除其中一个。

例如:

用户 JSON:

{
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}

管理员 JSON:

{
   id: 'user093',
   avatar: 'user357.gif'
}

从用户列表中删除管理员后,结果应该是这样的:

{
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}

我尝试使用_.pullAllBy(array, values, [iteratee=_.identity]),但它不适用于我!

【问题讨论】:

  • 这不是有效的 JSON。
  • 你能把第一个对象变成一个数组吗?因为键只是索引号,所以它使一切变得更简单
  • JSON 与您的问题完全无关。
  • 首先,正如其他人所说,这不是一个有效的 JSON。另外,我认为这不是定义对象数组的正确方法!
  • @SajadJafari 更好的是一个 Set,但 Vue.js 不支持这些结构。

标签: javascript arrays json vue.js vuejs2


【解决方案1】:

你可以使用

Object.values()

Object.values() 方法返回给定对象自己的可枚举属性值的数组,其顺序与 for...in 循环提供的顺序相同(不同之处在于 for-in 循环在原型链)。

Array.prototype.forEach()

forEach() 方法对每个数组元素执行一次提供的函数。

delete operator

JavaScript 删除操作符从对象中删除一个属性;如果不再持有对同一属性的引用,它最终会自动释放。

JSON.stringify()

JSON.stringify() 方法将 JavaScript 值转换为 JSON 字符串,如果指定了替换函数,则可选地替换值,或者如果指定了替换器数组,则可选地仅包含指定的属性。

var obj = {
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}


var obj2 = {
   id: 'user093',
   avatar: 'user357.gif'
}
Object.values(obj).forEach(function(o,i){
  if(JSON.stringify(obj2) == JSON.stringify(o))
    delete obj[i];
});
console.log(obj);

或:如果您想按单个键检查

var obj = {
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}


var obj2 = {
   id: 'user093',
   avatar: 'user357.gif'
}
Object.values(obj).forEach(function(o,i){
  if(obj2.id == o.id && obj2.avatar == o.avatar)
    delete obj[i];
});
console.log(obj)

【讨论】:

    【解决方案2】:

    你可以这样做

    let user = {
       0: { id: 'user134', avatar: 'user222.gif' },
       1: { id: 'user043', avatar: 'user242.gif' },
       2: { id: 'user093', avatar: 'user357.gif' },
       3: { id: 'user193', avatar: 'user543.gif' }
    };
    
    let admin = {
       id: 'user093',
       avatar: 'user357.gif'
    };
    for(key in user){
        if(user[key].id  === admin.id){
            delete user[key];
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可能是指object literal, and not JSON。您可以使用Object.keys 和reduce 来实现:

      const data = {
         0: { id: 'user134', avatar: 'user222.gif' },
         1: { id: 'user043', avatar: 'user242.gif' },
         2: { id: 'user093', avatar: 'user357.gif' },
         3: { id: 'user193', avatar: 'user543.gif' }
      };
      
      const admin = {
         id: 'user093',
         avatar: 'user357.gif'
      };
      
      const result = Object.keys(data).reduce((acc, currentKey) => {
        if (data[currentKey].id !== admin.id) acc[currentKey] = data[currentKey];
      
        return acc;
      }, {});
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        首先,这不是 JSON,它只是一个 JavaScript 对象。

        如果你想通过它的 id 字段删除另一个对象中的一个对象,你可以使用for ... in这样的方法。

         var o = {
             0: { id: 'user134', avatar: 'user222.gif' },
             1: { id: 'user043', avatar: 'user242.gif' },
             2: { id: 'user093', avatar: 'user357.gif' },
             3: { id: 'user193', avatar: 'user543.gif' }
          }
        
          for (var baseKey in o) {
            if (o[baseKey].id == "user093") {
              delete o[baseKey];
              console.log(o);
            }
          }
        

        【讨论】:

          【解决方案5】:
          let user = {
              { id: 'user134', avatar: 'user222.gif' },
              { id: 'user043', avatar: 'user242.gif' },
              { id: 'user093', avatar: 'user357.gif' },
              { id: 'user193', avatar: 'user543.gif' }
          };
          let admin = {
              id: 'user093',
              avatar: 'user357.gif'
           };
          let new_user=user.map(u=>{
              if(u.id!=admin.id){
                  return u;
              }
          });
          

          【讨论】:

            【解决方案6】:

            let mainObject ={
               0: { id: 'user134', avatar: 'user222.gif' },
               1: { id: 'user043', avatar: 'user242.gif' },
               2: { id: 'user093', avatar: 'user357.gif' },
               3: { id: 'user193', avatar: 'user543.gif' }
            }
            
            let filterObject = {
               id: 'user093',
               avatar: 'user357.gif'
            }
            
            Object.values(mainObject).forEach(({id, avatar},index)=> { 
              if(id === filterObject.id) delete mainObject[index];
            })
            console.log(mainObject)

            【讨论】:

              【解决方案7】:

              好的,所以您展示的只是 javascript 对象,而不是 JSON。但假设这就是你的意思,你可以这样做:

              let users = {
                 1: { id: 'user043', avatar: 'user242.gif' },
                 2: { id: 'user093', avatar: 'user357.gif' },
                 3: { id: 'user193', avatar: 'user543.gif' } 
              };
              
              delete users['2'];
              

              用户现在将在键 1 和 3 处包含对象。

              【讨论】:

              • 老兄!这是什么? admin 对象发生了什么?你刚刚决定删除user["2"] ??
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-22
              • 2022-11-16
              • 1970-01-01
              • 2017-09-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多