190

我有一个看起来像这样的对象:

var obj = {
    "objectiveDetailId": 285,
    "objectiveId": 29,
    "number": 1,
    "text": "x",
    "subTopics": [{
        "subTopicId": 1,
        "number": 1
    }, {
        "subTopicId": 2,
        "number": 32
    }, {
        "subTopicId": 3,
        "number": 22
    }]
}
var stToDelete = 2;

我已经lodash在我的应用程序中安装了其他东西。有没有一种有效的方法来lodash删除条目:{"subTopicId":2, "number":32}obj对象中?

或者有没有一种javascript方式来做到这一点?

4

10 回答 10

289

正如 lyyons 在评论中指出的那样,更惯用和笨拙的方法是使用_.remove,像这样

_.remove(obj.subTopics, {
    subTopicId: stToDelete
});

除此之外,您可以传递一个谓词函数,其结果将用于确定是否必须删除当前元素。

_.remove(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId === stToDelete;
});

或者,您可以通过过滤旧数组来创建一个新数组_.filter并将其分配给同一个对象,如下所示

obj.subTopics = _.filter(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId !== stToDelete;
});

或者

obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToKeep});
于 2014-01-22T11:17:13.970 回答
30

只需使用香草 JS。您可以使用splice删除元素:

obj.subTopics.splice(1, 1);

演示

于 2014-01-22T11:15:52.780 回答
27

你可以用_pull.

_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});

检查参考

于 2014-01-22T11:17:20.220 回答
26

您现在可以使用_.reject,它允许您根据需要删除的内容进行过滤,而不是根据需要保留的内容进行过滤。

不同于_.pull_.remove仅适用于数组,._reject适用于任何 Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});
于 2017-06-14T19:29:17.240 回答
8

据我所知,有四种方法可以做到这一点

const array = [{id:1,name:'Jim'},{id:2,name:'Parker'}];
const toDelete = 1;

首先:

_.reject(array, {id:toDelete})

第二个是:

_.remove(array, {id:toDelete})

这样数组就会发生变异。

第三个是:

_.differenceBy(array,[{id:toDelete}],'id')
// If you can get remove item 
// _.differenceWith(array,[removeItem])

最后一个是:

_.filter(array,({id})=>id!==toDelete)

我在学习lodash

回答做个记录,方便以后找到。

于 2019-10-16T02:49:14.683 回答
3

最简单最方便的方法——

_.without([2, 1, 2, 3], 1, 2);
// => [3]

_.without文档。

于 2021-08-21T10:40:15.823 回答
2

除了@thefourtheye 的回答,使用谓词 而不是传统的匿名函数:

  _.remove(obj.subTopics, (currentObject) => {
        return currentObject.subTopicId === stToDelete;
    });

或者

obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
    return currentObject.subTopicId !== stToDelete;
});
于 2017-04-25T11:20:06.937 回答
1

lodash 和打字稿

const clearSubTopics = _.filter(obj.subTopics, topic => (!_.isEqual(topic.subTopicId, 2)));
console.log(clearSubTopics);
于 2019-01-11T09:22:44.490 回答
0

这是带有数组的简单 lodash 函数,并使用索引号将其删除。

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
于 2019-04-02T18:28:17.747 回答
0

您可以使用removeItemFromArrayByPath函数,其中包括一些 lodash 函数和拼接

/**
 * Remove item from array by given path and index
 *
 * Note: this function mutates array.
 *
 * @param {Object|Array} data (object or array)
 * @param {Array|String} The array path to remove given index
 * @param {Number} index to be removed from given data by path
 *
 * @returns {undefined}
 */

const removeItemFromArrayByPath = (data, arrayPath, indexToRemove) => {
  const array = _.get(data, arrayPath, []);
  if (!_.isEmpty(array)) {
    array.splice(indexToRemove, 1);
  }
};

您可以在此处查看示例: https ://codepen.io/fatihturgut/pen/NWbxLNv

于 2021-02-05T13:56:01.107 回答