有没有更好的方法在包含结构化数据的数组上实现搜索?

时间:2015-12-26 07:07:21

标签: javascript c++ arrays dynamic

我经常遇到动态创建包含特定数据的对象数组的需要,这也需要搜索方法,例如:

的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

4 个答案:

答案 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:

https://jsfiddle.net/mckinleymedia/c2nnknsh/1/

答案 1 :(得分:0)

有几种方法可以做到这一点。

<强> [].find()

&#13;
&#13;
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;
&#13;
&#13;

<强> [].filter()

&#13;
&#13;
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;
&#13;
&#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>');