打破每个循环的JavaScript

时间:2019-10-17 03:02:31

标签: javascript

所以我在这里有一个对象称为计算作业,

{
  'a': [{'_id': '1'}, {'_id': '2'}, {'_id': '3'} ],
  'b': [{'_id': '4'}]
}

我想做的是,尝试删除'_id'为'1'的对象。

所以我最初的想法是,遍历它,然后当我找到该项目时,将其分解并删除该项目。这是我写的,

var res;
          for (var key in this.computedJobs) {
            for(var i=0; i<this.computedJobs[key].length; i++) {
              console.log(this.computedJobs[key])
              if (this.computedJobs[key][i]._id === '1') {
                res = this.computedJobs[key][i]
                break
              }
            }
          }

但是res是未定义的。

另一方面,我尝试过

var res;
          for (var key in this.computedJobs) {
            this.computedJobs[key].forEach(j => {
              if (j._id === '1') {
                res = j
                break
              }
            })
          }

但是出现错误Syntax Error: Unsyntactic break。谁能告诉我我在做什么错?

4 个答案:

答案 0 :(得分:0)

只需找到对象的索引并拼接数组即可。

var index = this.computedJobs[key].findIndex(j => j._id === '1');
if ( index >= 0 ) {
  this.computeJobs.splice(index, 1);
}

答案 1 :(得分:0)

如果您知道您最多具有1个匹配的“对象”,则可以使用数组中的Array#somesplice对象

var data = {
  'a': [{'_id': '1'}, {'_id': '2'}, {'_id': '3'} ],
  'b': [{'_id': '4'}]
};
Object.values(data).some(v => v.some(({_id}, index, array) => {
    console.log(_id);
    if (_id === '1') {
        return array.splice(index, 1);
        return true;
    }
}));
console.log(data);

通过使用Array#some,一旦回调中返回了真实值,迭代就会立即停止-您可以看到,唯一要测试的对象就是您要删除的对象-快速高效,没有不必要的迭代

让我们看看如果删除ID 5会发生什么情况

var data = {
  'a': [{'_id': '1'}, {'_id': '2'}, {'_id': '3'} ],
  'b': [{'_id': '4'}, {'_id': '5'}, {'_id': '6'}]
};
Object.values(data).some(v => v.some(({_id}, index, array) => {
    console.log(_id);
    if (_id === '5') {
        return array.splice(index, 1);
        return true;
    }
}));
console.log(data);

你可以看到它

  

下面的代码可能不是您所需要的-但以防万一

如果可以有多个具有相同ID的对象,那就复杂了

我使用reduceRight作为从头到尾从功能上遍历整个数组的便捷方法,因为如果您要对数组进行变异,那就是您要这样做的方式

var data = {
  'a': [{'_id': '1'}, {'_id': '2'}, {'_id': '3'} ],
  'b': [{'_id': '4'}]
};
Object.values(data).forEach(v => v.reduceRight((_, {_id}, index, array) => {
    if (_id === '1') {
        array.splice(index, 1);
    }
}, null));
console.log(data);

答案 2 :(得分:0)

我尝试了您的代码,并进行了最少的更改:

let objToDelete =   {
                    'a': [{'_id': '1'}, {'_id': '2'}, {'_id': '3'} ],
                    'b': [{'_id': '4'}]
                  };
var res =   {};                 
for (var key in objToDelete) {
   for(var i=0; i<objToDelete[key].length; i++) {
     if (objToDelete[key][i]._id === '1') {
       res = objToDelete[key][i];
       break;
     }
   }
}

if(Object.keys(res).length && res.hasOwnProperty('_id')){
    console.log('Yes we got the element!');
}
else{
    console.log('Object not found!');
}

console.log(res)

它正在工作。

答案 3 :(得分:0)

请尝试以下操作:

const jsonObj = {
  'a': [{'_id': '1'}, {'_id': '2'}, {'_id': '3'} ],
  'b': [{'_id': '4'}]
};

let result;
const keys = Object.keys(jsonObj);

keys.forEach(k => {
  const obj = jsonObj[k].find(o => o._id === '1');
  if (obj) return result = obj;
});
console.log('Result: ', result);