2015-07-10 63 views
4

我有一个复杂的对象数组,下面我有一个term_id来搜索。我试图找到匹配的term_id,然后返回与我发现term_id的相同Object的关联ticker: name如何通过对象数组循环查找ID然后返回兄弟键

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有简单的方法吗?

回答

2

// 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));

+0

您的搜索功能不应该对结果做些什么吗?像回报它? – StriplingWarrior

+0

感谢耶'forEach'工作:)我需要这个,4分钟 –

+0

我已经在forEach回报,这是不工作。修正了这个问题,并使其作为代码片段运行。检查您的控制台并运行。 – ChadF

1

希望这有助于你。这是,你可以通过你的对象变成一个功能和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"] 
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

+0

非常好,干净:) –

1

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()完成类似的事情,两者都在给定的条件下退出。