Javascript 从对象中获取对应的 key/value
Javascript get corresponding key/value from object
我有一个对象可能看起来像这样:
var nicknames = []
nicknames.push({id:"100", name:"john", id2:"200", name2:"max"});
但对象也可能看起来像这样:
nicknames.push({id:"200", name:"max", id2:"100", name2:"john"});
因此键和值可能会互换。
如果提供 "max" 的名称或 的 ID,如何获取名称和 ID "john" 以及“100”? 200?
var found_name, found_id;
for(var i = 0; i < nicknames.length; i++) {
var nn = nicknames[i];
if (nn.name == "max" || nn.id = "200") {
found_name = nn.name2;
found_id = nn.id2;
break;
} else if (nn.name2 == "max" || nn.id2 = "200") {
found_name = nn.name;
found_id = nn.id;
break;
}
}
也许这对你有用。
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);
您可以在此处查看实际效果:http://jsfiddle.net/b1yL28at/
如果你要做更多的查找,那么我能想到的最好的解决方案是建立一个逆映射,像这样
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, idIndex);
这个
{ john: { id: '200', name: 'max' }, max: { id: '100', name: 'john' } }
{ '100': { id: '200', name: 'max' }, '200': { id: '100', name: 'john' } }
然后你可以这样搜索
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/names;第二个用于昵称匹配(键是 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"]
它只是在 昵称 对中寻找名称或 ID 的匹配项,如果找到一个,returns 另一个。它可以变得更通用。
如果您想让 Douglas Crockford 高兴并通过使用 ES5 功能避免循环,那么:
function getOther(nameOrId) {
var result;
nicknames.some(function (nickname) {
if (nickname.id == nameOrId || nickname.name == nameOrId) {
return result = [nickname.id2, nickname.name2];
}
if (nickname.id2 == nameOrId || nickname.name2 == nameOrId) {
return result = [nickname.id, nickname.name];
}
});
return result;
}
但我不明白这一点,它的代码行数完全相同并且没有更清晰(当然是恕我直言)。
我有一个对象可能看起来像这样:
var nicknames = []
nicknames.push({id:"100", name:"john", id2:"200", name2:"max"});
但对象也可能看起来像这样:
nicknames.push({id:"200", name:"max", id2:"100", name2:"john"});
因此键和值可能会互换。
如果提供 "max" 的名称或 的 ID,如何获取名称和 ID "john" 以及“100”? 200?
var found_name, found_id;
for(var i = 0; i < nicknames.length; i++) {
var nn = nicknames[i];
if (nn.name == "max" || nn.id = "200") {
found_name = nn.name2;
found_id = nn.id2;
break;
} else if (nn.name2 == "max" || nn.id2 = "200") {
found_name = nn.name;
found_id = nn.id;
break;
}
}
也许这对你有用。
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);
您可以在此处查看实际效果:http://jsfiddle.net/b1yL28at/
如果你要做更多的查找,那么我能想到的最好的解决方案是建立一个逆映射,像这样
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, idIndex);
这个
{ john: { id: '200', name: 'max' }, max: { id: '100', name: 'john' } }
{ '100': { id: '200', name: 'max' }, '200': { id: '100', name: 'john' } }
然后你可以这样搜索
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/names;第二个用于昵称匹配(键是 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"]
它只是在 昵称 对中寻找名称或 ID 的匹配项,如果找到一个,returns 另一个。它可以变得更通用。
如果您想让 Douglas Crockford 高兴并通过使用 ES5 功能避免循环,那么:
function getOther(nameOrId) {
var result;
nicknames.some(function (nickname) {
if (nickname.id == nameOrId || nickname.name == nameOrId) {
return result = [nickname.id2, nickname.name2];
}
if (nickname.id2 == nameOrId || nickname.name2 == nameOrId) {
return result = [nickname.id, nickname.name];
}
});
return result;
}
但我不明白这一点,它的代码行数完全相同并且没有更清晰(当然是恕我直言)。