遗憾的是,我仍然不太熟悉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
。
我如何调整搜索?在将输入与我想要索引的问题进行比较之后,我可以给出找到问题的相应答案的输出。
答案 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
);
或者如果您更喜欢功能性方法:
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;
答案 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; }