2017-03-03 75 views
8

我的阵列看起来像这样采取了对象数组:打字稿 - 基于属性值

array = [object {id: 1, value: "itemname"}, object {id: 2, value: "itemname"}, ...] 

我的所有对象具有相同的attibutes,但使用不同的值。

有没有一种简单的方法,我可以使用该数组的WHERE语句?

就拿对象,其中object.id = VAR

或者我只需要循环整个阵列上,并检查每一个项目?我的阵列拥有超过100项,所以我想知道是否有更有效的方法

回答

1

我会使用filterreduce

let array = [ 
    { id: 1, value: "itemname" }, 
    { id: 2, value: "itemname" } 
]; 

let item1 = array.filter(item => item.id === 1)[0]; 
let item2 = array.reduce((prev, current) => prev || current.id === 1 ? current : null); 

console.log(item1); // Object {id: 1, value: "itemname"} 
console.log(item2); // Object {id: 1, value: "itemname"} 

code in playground

如果你关心迭代所述整个阵列上,然后使用some

let item; 
array.some(i => { 
    if (i.id === 1) { 
     item = i; 
     return true; 
    } 
    return false; 
}); 

code in playground

+3

数组有一个find()方法,该方法返回第一个出现https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/找到 –

+0

@JánHalaša真的,我忘了那个,你应该把它作为答案。我会为此投票。 –

1

你必须遍历数组,但是如果你创建一个hashmap来将每个id链接到一个索引并保存,你只需要做一次,这样你就可以直接引用任何objeft:

var idReference = myArray.reduce(function(map, record, index) { 
    map[ record.id ] = index; 
    return map; 
}, {}); 

var objectWithId5 = myArray[ idReference["5"] ]; 

这确实假定所有id都是唯一的。

+1

有一个Map类可以用来创建更高效​​的数据结构https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map –

+0

明确。期待在升级到IE Edge或决定使用modernizr后使用它。减少和更广泛的支持。引用每个对象的代码可能会更长,因为您将使用.get()作为它。对于不会磨砂的OP,因为无论如何它都会编译到这个结构。 – Shilly

0

您可以使用动态打字稿对象的数组搜索某个值,如果你需要从各个领域寻找价值没有指定列的对象

var searchText = 'first'; 

let items = [ 
      { id: 1, name: "first", grade: "A" }, 
      { id: 2, name: "second", grade: "B" } 
     ]; 

This below code will search for the value 

var result = items.filter(item => 
      Object.keys(item).some(k => item[k] != null && 
      item[k].toString().toLowerCase() 
      .includes(searchText.toLowerCase())) 
      ); 

可以使用相同的方法mak ea使用TypeScript在angularjs 4中搜索过滤器管道