循环遍历对象直到元素匹配

时间:2016-04-08 19:24:03

标签: javascript

我试图想出一个更简洁的方法,基本上循环一个对象,如果name匹配关键字do soemthing或者如果找不到匹配则执行其他操作。

var obj = {
    0: {
        name: 'test'
    },
    1: {
        name: 'test2'
    },
    2: {
        name: 'test3'
    },
    3: {
        name: 'test4'
    }
};

var len = (Object.keys(obj).length - 1);
var valuetomatch = 'test2';

while (len > -1) {
    if (obj[len].name === valuetomatch) {
        alert('match: ' + obj[len].name);
        break;
    } else if (len === 0) {
        alert('no match found!');
    }
    len -= 1;
}

https://jsfiddle.net/fw4svrck/

5 个答案:

答案 0 :(得分:4)

如果您确定,可以使用Array#some()只搜索一个项目。

var obj = { 0: { name: 'test' }, 1: { name: 'test2' }, 2: { name: 'test3' }, 3: { name: 'test4' } },
    valuetomatch = 'test2',
    found = Object.keys(obj).some(function (k) {
        if (obj[k].name === valuetomatch) {
            // do something
            return true;
        }
    });
document.write(found);

答案 1 :(得分:0)

这是在对象中搜索所需项目的另一种方法。

var obj = {
	0: {
  	name: 'test'
  },
  1: {
  	name: 'test2'
  },
  2: {
  	name: 'test3'
  },
  3: {
  	name: 'test4'
  }
};

var len = Object.keys(obj).length;
var valuetomatch = 'test2';
var flag=false;
for(i=0;i<len;i++){
	if(obj[i]["name"]==valuetomatch){
  	flag=true;
  	alert(valuetomatch+" is found");
  }
}
if(flag===false)
  	alert(valuetomatch+" is not found");

答案 2 :(得分:0)

不要使用它,@ Nina的解决方案效率更高。

使用Array#forEach方法而不是while循环使其更简单:

var obj = {
    0: {
        name: 'test'
    },
    1: {
        name: 'test2'
    },
    2: {
        name: 'test3'
    },
    3: {
        name: 'test4'
    }
};

var valuetomatch = 'test2';
var match;
Object.keys(obj).forEach(function(key) {
    if (obj[key].name === valuetomatch) {
        match = true;
    }
});
if (match) {
    alert('match: ' + valuetomatch);
} else {
    alert('no match found!');
}

答案 3 :(得分:0)

您可以使用for..in循环来迭代对象

var obj = { 0: { name: 'test' }, 1: { name: 'test2' }, 2: { name: 'test3' }, 3: { name: 'test4' } };

var valuetomatch = 'test2';

var matched = false;

for(var v in obj) {
    if(obj.hasOwnProperty(v) && obj[v].name == valuetomatch) {
        alert('match: ' + obj[v].name);
        matched = true;
        break;
    }
}

if (!matched) {
    alert('no match found!');
}

答案 4 :(得分:0)

for / in循环是一种有效的方式。

我已经将上面的解决方案中的isvforall重新考虑到一个函数中,您可以将其重用于具有类似结构的其他嵌套对象。 toMatch(obj,prop,value)有3个参数:obj(你正在遍历的对象),prop(你要过滤的属性)和value(你正在搜索匹配的值)。可以根据数据结构进一步重新考虑。

var obj1 = {
    0: {
        name: 'test'
    },
    1: {
        name: 'test2'
    },
    2: {
        name: 'test3'
    },
    3: {
        name: 'test4'
    }
};


var toMatch = function(obj, prop, value) {
  var foundMatch = false;
  for (var key in obj) {
    if (obj.hasOwnProperty(key) && obj[key][prop] === value) {
      alert('Found match! ' + value + ' is found at key ' + key);
      foundMatch = true;
      break;
    }
  }
  if (!foundMatch) {
    alert('no match found!');
  }
};

toMatch(obj1, 'name', 'test2');
// => Found match! test2 is found at key 1