Javascript搜索对象

时间:2017-09-10 10:57:38

标签: javascript object search

遗憾的是,我仍然不太熟悉JS中的对象,只为我的心理学博士编程,所以我没有很好的编程技巧。 我设法创建了一个很好的对象,可以很好地捕获我的数据结构:

var items = {
  anamnese_akut: [{
    id: 1,
    question: 'Haben Sie die Beschwerden zum ersten Mal?',
    answer: 'Ja, also so etwas ist noch nie passiert.'
  }, {
    id: 2,
    question: 'Haben Sie in den letzten Wochen unbeabsichtigt Gewicht verloren?',
    answer: 'Nein, bestimmt nicht.'
  }],
  anamnese_allgemein: [{
    id: 3,
    question: 'Sind bei Ihnen Vorerkrankungen bekannt?',
    answer: 'Eigentlich nicht, nein.'
  }, {
    id: 4,
    question: 'Wurden Sie schon mal operiert?',
    answer: 'Ich hatte eine Blinddarmoperation als Kind, und in den letzten zwei Jahren dreimal eine Ausschabung nach Fehlgeburten.'
  }]
};    

我现在想要搜索一个输入变量,其中只包含这4个问题中的一个,但可以来自这两个类别。我已经设法用一个unnested对象做了这样的事情,使用了这里的代码:JS search in object values,但是我无法让它工作,也不知道如何使它适应像{{{ 1}}和anamnese_akut

我如何调整搜索?在将输入与我想要索引的问题进行比较之后,我可以给出找到问题的相应答案的输出。

5 个答案:

答案 0 :(得分:1)

我认为还有另一种在这里构建数据的方法。您可以避免使用数组并使用referencing by object properties。优点是,您可以在迭代方面不使用“搜索”访问值,而是通过对象的属性哈希来访问。

注意:出于可读性目的,我在示例中仅使用了缩小的数据子集。

示例A - 基于索引编号

var anamnese_akut = {
    q: {
  	1:'Haben Sie die Beschwerden zum ersten Mal?',
	2: 'Haben Sie in den letzten Wochen unbeabsichtigt Gewicht verloren?',
    },
  
    a: {
  	1:'Ja, also so etwas ist noch nie passiert.',
        2:'Nein, bestimmt nicht.'
    },
};

console.log(anamnese_akut.q['1']);
console.log(anamnese_akut.a['1']);

通过这个例子,您可以将数据建立在索引号(1,2,3 ......)上,并按照该号码访问您的问题和答案。

优势:不易出错,因为索引很短,可以存储为数字。

缺点:索引号必须在q和a的整体上下文中知道。

示例B - 按ID访问但结构不同

var questions = {
    anamnese_akut: {
  	1:'Haben Sie die Beschwerden zum ersten Mal?',
        2:'Haben Sie in den letzten Wochen unbeabsichtigt Gewicht verloren?',
    },
};

var answers = {
    anamnese_akut: {
  	1: 'Ja, also so etwas ist noch nie passiert.',
        2: 'Nein, bestimmt nicht.',
    },
};

console.log(questions.anamnese_akut['1']);
console.log(answers.anamnese_akut['1']);

优点:解耦问题和答案,仅需访问索引(如示例A所示)

缺点:在结构设计层面上有更多的工作,因为这里有更多的冗余(因为我们现在有两个带有anamnese_akut条目的对象)。

示例C - 按问题访问

var anamnese_akut = {
    'Haben Sie die Beschwerden zum ersten Mal?' : 'Ja, also so etwas ist noch nie passiert.',
};

console.log(anamnese_akut['Haben Sie die Beschwerden zum ersten Mal?']);

优点:立即回复

缺点:问题字符串需要严格按照对象中的规定或访问失败并返回undefined。

我个人会选择例B,因为它允许我分解问题和答案数据上下文(这可能会变得很重要,具体取决于你的应用程序用例),并且仍允许我访问一个给定的索引号。

答案 1 :(得分:0)

如果我正确理解你的意思:你的输入是问题文本,它需要与其中一个对象匹配,那么这应该可以解决问题:

var input = 'Haben Sie die Beschwerden zum ersten Mal?' // For demo purposes.
var output = items.anamnese_akut.find(x => x.question === input) || items.anamnese_allgemein.find(x => x.question === input)

当然,这不是最优雅的解决方案,特别是如果您添加更多anamnese个对象。

答案 2 :(得分:0)

你可以通过以下方式完成



var items = {
  anamnese_akut: [{
    id: 1,
    question: 'Haben Sie die Beschwerden zum ersten Mal?',
    answer: 'Ja, also so etwas ist noch nie passiert.'
  }, {
    id: 2,
    question: 'Haben Sie in den letzten Wochen unbeabsichtigt Gewicht verloren?',
    answer: 'Nein, bestimmt nicht.'
  }],
  anamnese_allgemein: [{
    id: 3,
    question: 'Sind bei Ihnen Vorerkrankungen bekannt?',
    answer: 'Eigentlich nicht, nein.'
  }, {
    id: 4,
    question: 'Wurden Sie schon mal operiert?',
    answer: 'Ich hatte eine Blinddarmoperation als Kind, und in den letzten zwei Jahren dreimal eine Ausschabung nach Fehlgeburten.'
  }]
};

let query = 'Wurden Sie schon mal operiert?';
let answer = Object.keys(items).reduce(function(a, b){
    let val = items[b].reduce(function(a, b){
        if(b.question == query){
            return b.answer;
        }
    }, "not available")
    if(val == "not available")
        return a;
    return val;
}, "not available");
console.log(answer);




答案 3 :(得分:0)

const input = "whatever";
const result = Object.values(items).reduce(
   (res,category)=> res || category.find(obj => obj.question === input ), false
);

In action

或者如果您更喜欢功能性方法:

data have;
  sched_dep_time=515;
  dep_time=1515;
run;

data want;
  set have;
  SchedDepTime=input(put(sched_dep_time,4.),hhmmss.);
  DepTime=input(put(dep_time,4.),hhmmss.);
  format SchedDepTime DepTime time.;
  put (Sched_Dep_Time SchedDepTime Dep_Time DepTime)(=);
run;

In action

答案 4 :(得分:0)

为了获取内部数组的类别和索引,您可以浏览给定对象的键,然后迭代内部数组以检查问题。如果给定的字符串等于question属性,则返回实际的类别和索引。如果未找到结果,则返回undefined

function find(object, search) {
    var result;

    Object.keys(object).some(function (k) {
        return object[k].some(function (o, i) {
            if (o.question === search) {
                result = { category: k, index: i };
                return true;
            }
        });
    });

    return result;
}

var items = { anamnese_akut: [{ id: 1, question: 'Haben Sie die Beschwerden zum ersten Mal?', answer: 'Ja, also so etwas ist noch nie passiert.' }, { id: 2, question: 'Haben Sie in den letzten Wochen unbeabsichtigt Gewicht verloren?', answer: 'Nein, bestimmt nicht.' }], anamnese_allgemein: [{ id: 3, question: 'Sind bei Ihnen Vorerkrankungen bekannt?', answer: 'Eigentlich nicht, nein.' }, { id: 4, question: 'Wurden Sie schon mal operiert?', answer: 'Ich hatte eine Blinddarmoperation als Kind, und in den letzten zwei Jahren dreimal eine Ausschabung nach Fehlgeburten.' }] };

console.log(find(items, 'Sind bei Ihnen Vorerkrankungen bekannt?'));
.as-console-wrapper { max-height: 100% !important; top: 0; }