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

我的数组如下所示:

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

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

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

取object.id = var的对象

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

【问题讨论】:

    标签: javascript arrays typescript


    【解决方案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】:

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

        【讨论】:

        • Array 有一个 find() 方法返回第一次出现的developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
        • @JánHalaša 没错,我忘了那个,你应该把它作为答案发布。我会投票给它。
        • 使用 filter() 仍然是一种更好的方法,因为它会捕获属性相同值的多个实例。您可以检查长度以确保只有 1 个实例。
        猜你喜欢
        • 2019-08-12
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        • 2018-04-15
        • 2022-12-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        相关资源
        最近更新 更多