如何遍历对象数组以查找 ID 然后返回兄弟键
Posted
技术标签:
【中文标题】如何遍历对象数组以查找 ID 然后返回兄弟键【英文标题】:How to loop through Array of Objects to find ID then return a sibling key 【发布时间】:2015-09-29 16:08:56 【问题描述】:下面有一个复杂的对象数组,我有一个term_id
可以搜索。我试图找到匹配的term_id
,然后从我找到term_id
的同一个对象返回关联的ticker: name
。
container = [Object, Object];
// container:
[
0: Object
tags: [
0:
term: "tag_name_1",
term_id: 1111
,
0:
term: "tag_name_2",
term_id: 2222
],
ticker:
name: "ticker1"
,
1: Object
tags: [
0:
term: "tag_name_3",
term_id: 3333
],
ticker:
name: "ticker2"
]
您将如何实现这一目标? _lodash 有没有简单的方法?
【问题讨论】:
【参考方案1】:// You can do this with native JS:
var container = [tags: [term: "tag_name_1",term_id: 1111,term: "tag_name_2",term_id: 2222],ticker: name: "ticker1",tags: [term: "tag_name_3",term_id: 3333],ticker: name: "ticker2"];
function search (container, id)
var contains = false;
var result;
container.forEach(function(obj)
obj.tags.forEach(function(innerData)
if (innerData.term_id === id)
contains = true;
)
if (contains)
result = obj.ticker.name;
contains = false;
);
return result;
console.log(search(container, 1111));
【讨论】:
您的搜索功能不应该对结果做些什么吗?喜欢退货吗? 谢谢,forEach
有效 :) 我需要 Gist,4 分钟
我在 forEach 中得到了回报,但它不起作用。修复了该问题并使其作为代码 sn-p 运行。检查您的控制台并点击运行。【参考方案2】:
您可以为此使用Array.prototype.some
。例如:
function find(arr, t)
var ticker = null;
arr.some(function (doc)
var tagMatch = doc.tags.some(function (tag)
return tag.term_id === t;
);
if (tagMatch)
ticker = doc.ticker.name;
return tagMatch;
);
return ticker;
这是JSFiddle。
【讨论】:
非常漂亮和干净:)【参考方案3】:希望这对您有所帮助。这是一个函数,您可以将您的对象传递给您搜索的 term_id,它会返回找到的代码名称:
var objs = [
tags: [
term: "tag_name_1",
term_id: 1111
,
term: "tag_name_2",
term_id: 2222
],
ticker:
name: "ticker1"
,
tags: [
term: "tag_name_3",
term_id: 3333
],
ticker:
name: "ticker2"
];
function getTickerNamesById(objs,id)
var foundNames = [];
objs.forEach(function(obj)
obj.tags.forEach(function(term)
if(term.term_id===id)foundNames.push(obj.ticker.name);
);
);
return foundNames;
getTickerNamesById(objs,3333); // ["ticker2"]
【讨论】:
【参考方案4】:forEach() 循环可以工作,但是一旦 id 匹配,没有办法阻止它循环遍历整个对象。假设 id 是唯一的,性能更好的选项是 while 循环:
function findId(id,container)
var i = 0,
j;
while (i < container.length)
j = 0;
while (j < container[i].tags.length)
if (container[i].tags[j].term_id === id)
return container[i].ticker.name;
j += 1;
i += 1;
throw "item not found";
如果您的容器很大,您可能需要考虑这种优化。如果您更喜欢函数式方法,您可以使用some() 或every() 完成类似的事情,两者都会在指定条件下退出。
【讨论】:
以上是关于如何遍历对象数组以查找 ID 然后返回兄弟键的主要内容,如果未能解决你的问题,请参考以下文章
如何循环遍历对象数组并根据 JavaScript 中的条件添加新的对象键?