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

95
我的数组看起来像这样:
array = [object {id: 1, value: "itemname"}, object {id: 2, value: "itemname"}, ...]

所有我的对象都具有相同的属性,但具有不同的值。
我是否可以使用 WHERE 语句来处理这个数组?
引用: 选择 object.id = var 的对象
还是我只需要循环遍历整个数组并检查每个项?我的数组有超过100个条目,所以我想知道是否有更高效的方法。

1
这是一个TypeScript问题的方面是什么? - undefined
5个回答

193

7
谢谢,这个解决方案最简洁了并且它可行! - Nicolas
让item1 = array.find((i : any ) => i.id === 1); - persec10000

12

我会使用 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"}

Let me translate it for you:

(代码在 playground 中)

如果你关心遍历整个数组,那么请使用 some:

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

(code in playground)


4
数组有一个find()方法,它返回第一个出现的元素。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/find - Ján Halaša
@JánHalaša 没错,我忘了那个,你应该把它发表为答案。我会投票支持的。 - Nitzan Tomer
1
使用 filter() 仍然是更好的方法,因为它可以捕获属性的多个相同值实例。您可以检查长度以确保只有一个实例。 - user14994547

7

如果您需要在 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

我必须在TypeScript中声明类型才能让它正常工作:

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

2

您需要遍历数组,但如果创建一个哈希映射将每个ID链接到索引并保存它,那么您只需要执行一次,之后就可以直接引用任何对象:

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

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

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

2
有一个Map类可以用于创建更高效的数据结构。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map - Ján Halaša
1
绝对没错。一旦我们升级到IE Edge或决定使用modernizr,我很期待使用它。Reduce等更广泛地得到支持。但要引用每个对象的代码可能会更长,因为你会用 .get() 来引用它。对于OP来说,这不重要,因为它最终会编译成这个结构。 - Shilly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接