TypeScript - 根据属性值从数组中取出对象

Posted

技术标签:

【中文标题】TypeScript - 根据属性值从数组中取出对象【英文标题】:TypeScript - Take object out of array based on attribute value 【发布时间】:2017-07-23 15:15:18 【问题描述】:

我的数组如下所示:

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

我所有的对象都具有相同的属性,但具有不同的值。

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

取object.id = var的对象

还是我只需要遍历整个数组并检查每个项目?我的数组有超过 100 个条目,所以我想知道是否有更有效的方法

【问题讨论】:

【参考方案1】:

我必须声明类型才能让它在打字稿中工作:

let someId = 1  
array.find((i:  id: string; ) => i.id === someId)

【讨论】:

【参考方案2】:

如果您需要在不指定列的情况下从对象的所有字段中搜索值,您可以使用 TypeScript 动态搜索对象数组中的某个值

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

同样的方法可用于使用 TypeScript 在 angularjs 4 中制作搜索过滤器管道

【讨论】:

【参考方案3】:

使用Array.find:

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

let item1 = array.find(i => i.id === 1);

Array.find 在 MDN:https://developer.mozilla.org/en/docs/Web/javascript/Reference/Global_Objects/Array/find

【讨论】:

谢谢,这个解决方案最干净而且有效!【参考方案4】:

您必须循环遍历数组,但是如果您制作一个哈希映射来将每个 id 链接到一个索引并保存它,您只需执行一次,因此您可以直接引用之后的任何对象:

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

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

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

【讨论】:

有一个 Map 类可用于制作更高效的数据结构developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 肯定。期待在我们升级到 IE Edge 或决定使用 modernizr 后使用它。 Reduce等得到更广泛的支持。不过,引用每个对象的代码可能会更长,因为您将使用 .get() 。对于不会遮罩的 OP,因为无论如何它都会编译成这种结构。【参考方案5】:

我会使用filter 或reduce:

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)

【讨论】:

Array 有一个 find() 方法返回第一次出现的developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… @JánHalaša 没错,我忘了那个,你应该把它作为答案发布。我会投票给它。 使用 filter() 仍然是一种更好的方法,因为它会捕获属性相同值的多个实例。您可以检查长度以确保只有 1 个实例。

以上是关于TypeScript - 根据属性值从数组中取出对象的主要内容,如果未能解决你的问题,请参考以下文章

根据JavaScript中的属性值从对象数组中选择[重复]

根据值从对象数组中选择一个属性:Javascript

数组对象根据某个属性取出重复的个数

浅谈解构(js)

浅谈解构(js)

浅谈解构(js)