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,你的答案很有魅力。非常感谢。我也会检查其他答案。