Javascript从对象获取相应的键/值
我有一个对象可能看起来像这样:Javascript从对象获取相应的键/值,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象可能看起来像这样: var nicknames = [] nicknames.push({id:"100", name:"john", id2:"200", name2:"max"}); nicknames.push({id:"200", name:"max", id2:"100", name2:"john"}); 但对象也可能是这样的: var nicknames = [] nicknames.push({id:"100", name:"john", id2:"200", na
var nicknames = []
nicknames.push({id:"100", name:"john", id2:"200", name2:"max"});
nicknames.push({id:"200", name:"max", id2:"100", name2:"john"});
但对象也可能是这样的:
var nicknames = []
nicknames.push({id:"100", name:"john", id2:"200", name2:"max"});
nicknames.push({id:"200", name:"max", id2:"100", name2:"john"});
所以键和值可能会被切换
如果提供了“max”的名称或“200”的id,如何获取名称和id“john”和“100”?var found\u name,found\u id;
for(var i=0;i<昵称.length;i++){
var nn=昵称[i];
如果(nn.name==“max”| nn.id=“200”){
找到\u name=nn.name2;
找到的_id=nn.id2;
打破
}否则如果(nn.name2==“max”|| nn.id2=“200”){
已找到\u name=nn.name;
找到的\u id=nn.id;
打破
}
}
也许这会对你有用
var nicknames= [ {id:"100", nickname:"John"}, {id:"200", nickname:"Michael"} ];
function getByName(arr, value) {
for (var i=0, iLen=arr.length; i<iLen; i++) {
if (arr[i].nickname == value) return arr[i];
}
}
var object = getByName(nicknames, "John");
// Will show '100'
alert(object.id);
var昵称=[{id:“100”,昵称:“John”},{id:“200”,昵称:“Michael”}];
函数getByName(arr,value){
对于(var i=0,iLen=arr.length;i如果要进行更多查找,那么我能想到的最佳解决方案是构建一个逆映射,如下所示
var nicknames = []
nicknames.push({
id: "100",
name: "john",
id2: "200",
name2: "max"
});
var idIndex = {},
nameIndex = {};
nicknames.forEach(function(currentNickName) {
idIndex[currentNickName.id] = {
id: currentNickName.id2,
name: currentNickName.name2
};
idIndex[currentNickName.id2] = {
id: currentNickName.id,
name: currentNickName.name
};
nameIndex[currentNickName.name] = {
id: currentNickName.id2,
name: currentNickName.name2
};
nameIndex[currentNickName.name2] = {
id: currentNickName.id,
name: currentNickName.name
};
});
console.log(nameIndex["max"]);
// { id: '100', name: 'john' }
console.log(nameIndex["john"]);
// { id: '200', name: 'max' }
console.log(idIndex["100"]);
// { id: '200', name: 'max' }
console.log(idIndex["200"]);
// { id: '100', name: 'john' }
然后看起来像
console.log(nameIndex, idIndex);
这个
然后你可以像这样搜索
var nicknames = []
nicknames.push({
id: "100",
name: "john",
id2: "200",
name2: "max"
});
var idIndex = {},
nameIndex = {};
nicknames.forEach(function(currentNickName) {
idIndex[currentNickName.id] = {
id: currentNickName.id2,
name: currentNickName.name2
};
idIndex[currentNickName.id2] = {
id: currentNickName.id,
name: currentNickName.name
};
nameIndex[currentNickName.name] = {
id: currentNickName.id2,
name: currentNickName.name2
};
nameIndex[currentNickName.name2] = {
id: currentNickName.id,
name: currentNickName.name
};
});
console.log(nameIndex["max"]);
// { id: '100', name: 'john' }
console.log(nameIndex["john"]);
// { id: '200', name: 'max' }
console.log(idIndex["100"]);
// { id: '200', name: 'max' }
console.log(idIndex["200"]);
// { id: '100', name: 'john' }
在保留此数据表示时,必须在整个数组上循环,这是低效的
我认为你应该(如果可以的话)改变你的数据表示方式,选择一个关联数组,其中键是配对的id名称,值是昵称。这样,查找匹配项变得简单而高效
或者,可能更好,因为它减少了冗余,两个关联数组:第一个用于id/名称;第二个用于昵称匹配(键是id,值也是id).如果数据结构如所述,并且这里正好有两个名称和ID,并且名称和ID集在每个对象中都是唯一的,则应执行以下操作:
var nicknames = [{id:"100", name:"john", id2:"200", name2:"max"},
{id:"300", name:"tim", id2:"400", name2:"fred"}];
function getOther(nameOrId) {
var nickname;
for (var i=0, iLen=nicknames.length; i<iLen; i++) {
nickname = nicknames[i];
if (nickname.id == nameOrId || nickname.name == nameOrId) {
return [nickname.id2, nickname.name2];
}
if (nickname.id2 == nameOrId || nickname.name2 == nameOrId) {
return [nickname.id, nickname.name];
}
}
}
console.log(getOther('max')); // ["100", "john"]
console.log(getOther('100')); // ["200", "max"]
console.log(getOther('400')); // ["300", "tim"]
但我看不出有什么意义,它的代码行数完全相同,而且没有更清晰的内容(当然是IMHO)。没有内置的按对象值进行搜索。您必须编写一个循环。对象是否正好包含两个名称和两个ID?是的,两个名称和两个ID,但它们可能在不同的键中(id1或id2/name1或name2)所以,给定一个名称或id值,你想取回另一个id和名称吗?Barmar,你的答案很有魅力。非常感谢。我也会检查其他答案。