如何遍历对象数组以查找 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 然后返回兄弟键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongo 聚合循环遍历数组并返回所需的文档?

如何遍历对象字典及其键

遍历数组以返回数组的名称

如何循环遍历对象数组并根据 JavaScript 中的条件添加新的对象键?

排序数组以及遍历普通对象的键值对以及如何遍历一个不同键值的对象数组

查找和替换数组中的对象(基于 id)