我经常遇到动态创建包含特定数据的对象数组的需要,这也需要搜索方法,例如:
的Javascript
var people = [];
var addPerson = function(name, age) {
people.push({name:name,
age:age});
}
getArrayID = function (name) {
for(var i = 0 ; i < main.nodes.length ; i++) {
if(main.nodes[i].name == name)
return i;
}
return -1;
}
addPerson("Person A", 22);
addPerson("Person B", 23);
console.log(people[getArrayID("PersonB")].age);
// Result: 23
虽然这有效,但感觉它是不正确的解决方案,因为它已被标记为&#39;数据片段,因为它通常还包括getArrayName(id)方法。
如果可能的话,我希望看到“松散”的解决方案。语言如 Javascript (其中对象和数组可以用字符串命名),以及更严格的语言,如 C ++ 或 Java 。
答案 0 :(得分:0)
是的。使用lodash。有了它,您可以简化这种方式:
var person = _.find(people, { "name": "Person B" });
if (person !== undefined) {
var age = 'age' in person ? person.age:'not available';
console.log('Age: ',age);
} else {
console.log("Couldn't find that guy");
}
这是一个jsfiddle:
答案 1 :(得分:0)
有几种方法可以做到这一点。
<强> [].find() 强>:
var people = [];
var addPerson = function(name, age) {
people.push({
name: name,
age: age
});
}
// will return ONE person or null
getPerson = function(name) {
return people.find(function(person) {
return person.name == name;
});
}
addPerson("Person A", 22);
addPerson("Person B", 23);
var pers = getPerson("Person B");
// we must check pers is not null/undefined
if (pers) {
console.log(pers.age);
document.write(pers.age);
}
&#13;
<强> [].filter() 强>:
var people = [];
var addPerson = function(name, age) {
people.push({
name: name,
age: age
});
}
// will return an array of persons (can be empty)
getPerson = function(name) {
return people.filter(function(person) {
return person.name == name;
});
}
addPerson("Person A", 22);
addPerson("Person B", 23);
var pers = getPerson("Person B")[0];
// we must check pers is not null/undefined
if (pers) {
console.log(pers.age);
document.write(pers.age);
}
&#13;
答案 2 :(得分:0)
如果name
的人是唯一的,我会使用object
代替数组。这样,您不必每次都搜索整个数组,并从本机“搜索性能”中获利。
这样的事情:
var people = {};
var addPerson = function(name, age) {
people[name] = {name:name, age:age};
}
addPerson("Person A", 22);
addPerson("Person B", 23);
var person = people["PersonB"];
console.log(person && person.age); // Result: 23
答案 3 :(得分:0)
在 Javascript 中,您可以将Array.prototype.reduce()
用于混合目的,例如只返回索引或特殊模式。
此解决方案的特征是具有搜索参数的对象,例如要搜索的属性和要查找的值。结果是一个数组,其中包含数组所有匹配模式的索引。
function setCondition(condition) {
var key = Object.keys(condition)[0],
value = condition[key];
return function (r, a, i) {
if (a[key] === value) {
r.push(i);
}
return r;
}
}
var people = [{ name: 'Person A', age: 22 }, { name: 'Person B', age: 23 }],
indices = people.reduce(setCondition({ name: 'Person B' }), []);
document.write('<pre>' + JSON.stringify(indices, 0, 4) + '</pre>');