【问题标题】:How to find and remove an item in source and assign the removed item?如何在源中查找和删除项目并分配已删除的项目?
【发布时间】:2015-11-10 01:43:35
【问题描述】:

我有一个对象数组

a = [
    {name:'java'},
    {name:'ruby'},
    {name:'javascript'},
    {name:'meteor'}
];

我想在其中找到一个键/值,将其从源中删除并使用下划线将其分配给另一个变量。我试过_.find, _.findWhere,但他们没有删除找到的项目。

问题是关于找到一个项目,将其删除并使用下划线返回已删除的项目。

【问题讨论】:

标签: underscore.js


【解决方案1】:

linked answer 显示了如何做到这一点:

var item = _.findWhere(a, {name:'javascript'}) // find item

a = _.without(a, item); // remove the item from the array

var a = [
    {name:'java'},
    {name:'ruby'},
    {name:'javascript'},
    {name:'meteor'}
];

var item = _.findWhere(a, {name:'javascript'})

a = _.without(a, item);

console.log('matched item:', item)
console.log('array a without the item:', a)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
see output in the console

【讨论】:

    【解决方案2】:

    documentation,我们有_.findIndex

    findIndex _.findIndex(array, predicate, [context])

    类似于.indexOf,返回谓词真值测试通过的第一个索引;否则返回 -1。

    获得相关项的索引后,您可以splice 该索引处的数组并从Array.prototype.splice 返回的长度为1 的数组中检索第0 个索引项。

    var sourceArray = [
      {name:'java'},
      {name:'ruby'},
      {name:'javascript'},
      {name:'meteor'}
    ];
    
    var index = _.findIndex(sourceArray, function(x) {
      return x.name === 'javascript';
    });
    var item = sourceArray.splice(index, 1)[0];
    

    编辑:您也可以使用 _.findWhere_.without 来完成,如 mef 的回答所示。它的效率有点低,但可读性也更高。但是,请注意,它将删除具有该键值对的对象的 所有 个实例,而不仅仅是第一个,因此请确保这是您想要的行为。

    【讨论】:

    • mmm...能不能一次性完成,而不是获取索引,用它来拼接。
    • @Bala 也许可以。我会再考虑一下。
    【解决方案3】:

    我做了一个 html 页面的例子,它创建了 2 个字符串数组和 3 个按钮 1.获取a的元素'java'并将其放在b上 2. 警报上的每个元素 3. b上每个元素的alert

    <html>
    <head>
    
    <script>
    var a = [
        {name:'java'},
        {name:'ruby'},
        {name:'javascript'},
        {name:'meteor'}
    ];
    
    var b = [
        {name:'c#'},
        {name:'vb'}
    ];
    
    
    function lista(){
      for (var count = 0; count < a.length; count++) {
            alert(a[count].name);
        }
    }
    
    function listb(){
      for (var count = 0; count < b.length; count++) {
            alert(b[count].name);
        }
    }
    
    function takeOff(str){
        for (var count = 0; count < a.length; count++) {
            if(a[count].name == str){
              b.push(a[count]);
              a.splice(count, 1);
            }
        }
    }
    
    </script>
    </head>
    <body>
    
    <button onclick="takeOff('java');">takeOff 'java'</button>
    <button onclick="lista();">list a</button>
    <button onclick="listb();">list b</button>
    
    </body>
    </html>
    

    希望这是您想要实现的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多