es6删除对象的属性_javascript - 按对象属性从数组中删除对象
javascript - 按对象属性从数组中删除对象
var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}] // all that should remain
如何通过匹配对象属性从数组中删除对象?
请使用原生JavaScript。
我在使用拼接时遇到问题,因为每次删除都会缩短长度。在orignal索引上使用克隆和拼接仍然会给你带来缩短长度的问题。
Dan Kanze asked 2019-07-17T23:34:28Z
12个解决方案
132 votes
我假设您使用过Array#filter这样的东西?
for (var i = 0; i < arrayOfObjects.length; i++) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) !== -1) {
arrayOfObjects.splice(i, 1);
}
}
你需要做的就是修复这个bug,下次再减少Array#filter,然后(向后循环也是一个选项):
for (var i = 0; i < arrayOfObjects.length; i++) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) !== -1) {
arrayOfObjects.splice(i, 1);
i--;
}
}
为了避免线性时间删除,您可以编写要保留在数组上的数组元素:
var end = 0;
for (var i = 0; i < arrayOfObjects.length; i++) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) === -1) {
arrayOfObjects[end++] = obj;
}
}
arrayOfObjects.length = end;
为了避免在现代运行时中进行线性时间查找,您可以使用哈希集:
const setToDelete = new Set(listToDelete);
let end = 0;
for (let i = 0; i < arrayOfObjects.length; i++) {
const obj = arrayOfObjects[i];
if (setToDelete.has(obj.id)) {
arrayOfObjects[end++] = obj;
}
}
arrayOfObjects.length = end;
它可以包含在一个很好的功能中:
Array#filter
如果您不需要这样做,那就是Array#filter:
const toDelete = new Set(['abc', 'efg']);
const newArray = arrayOfObjects.filter(obj => !toDelete.has(obj.id));
Ry- answered 2019-07-17T23:35:22Z
60 votes
您可以通过其中一个属性删除项目,而无需使用任何第三方库,如下所示:
var removeIndex = array.map(function(item) { return item.id; })
.indexOf("abc");
~removeIndex && array.splice(removeIndex, 1);
parliament answered 2019-07-17T23:35:45Z
24 votes
findIndex适用于现代浏览器:
var myArr = [{id:'a'},{id:'myid'},{id:'c'}];
var index = arr.findIndex(function(o){
return o.id === 'myid';
})
if (index !== -1) myArr.splice(index, 1);
fatlinesofcode answered 2019-07-17T23:36:09Z
24 votes
使用lodash /下划线:
如果要修改现有数组本身,则必须使用splice。 这是使用findWhere of underscore / lodash的更好/可读的方式:
var items= [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'},
{id:'hij',name:'ge'}];
items.splice(_.indexOf(items, _.findWhere(items, { id : "abc"})), 1);
使用ES5或更高版本
(没有lodash /下划线)
从ES5开始,我们在阵列上有findIndex方法,所以它很容易没有lodash /下划线
items.splice(items.findIndex(function(i){
return i.id === "abc";
}), 1);
(几乎所有现代浏览器都支持ES5)
关于findIndex及其浏览器兼容性
Rahul R. answered 2019-07-17T23:37:14Z
9 votes
如果您只想将其从现有阵列中删除而不是创建新阵列,请尝试:
var items = [{Id: 1},{Id: 2},{Id: 3}];
items.splice(_.indexOf(items, _.find(items, function (item) { return item.Id === 2; })), 1);
user2704940 answered 2019-07-17T23:37:38Z
5 votes
请使用原生JavaScript。
作为替代方案,使用ECMAScript 5的更多“功能”解决方案,您可以使用:
var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}]; // all that should remain
arrayOfObjects.reduceRight(function(acc, obj, idx) {
if (listToDelete.indexOf(obj.id) > -1)
arrayOfObjects.splice(idx,1);
}, 0); // initial value set to avoid issues with the first item and
// when the array is empty.
console.log(arrayOfObjects);
[ { id: 'hij', name: 'ge' } ]
根据ECMA-262中'Array.prototype.reduceRight'的定义:
reduceRight不会直接改变调用它的对象,但是对象可能会被callbackfn的调用所突变。
所以这是reduceRight的有效用法。
Sylvain Leroux answered 2019-07-17T23:38:26Z
4 votes
通过递减filter来反向循环以避免此问题:
for (var i = arrayOfObjects.length - 1; i >= 0; i--) {
var obj = arrayOfObjects[i];
if (listToDelete.indexOf(obj.id) !== -1) {
arrayOfObjects.splice(i, 1);
}
}
或者使用filter:
var newArray = arrayOfObjects.filter(function(obj) {
return listToDelete.indexOf(obj.id) === -1;
});
Felix Rabe answered 2019-07-17T23:38:57Z
2 votes
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}] // all that should remain
根据你的答案将是这样的。 当你单击某个特定对象时,在param中发送删除我的函数的索引。 这个简单的代码将像魅力一样工作。
function deleteme(i){
if (i > -1) {
arrayOfObjects.splice(i, 1);
}
}
Subhojit Mondal answered 2019-07-17T23:39:22Z
2 votes
使用Set和ES6过滤器检查这一点。
let result = arrayOfObjects.filter( el => (-1 == listToDelete.indexOf(el.id)) );
console.log(result);
这是JsFiddle:[https://jsfiddle.net/jsq0a0p1/1/]
Miroslav Savovski answered 2019-07-17T23:39:53Z
1 votes
带过滤器和放大器 指数
withLodash = _.filter(arrayOfObjects, (obj) => (listToDelete.indexOf(obj.id) === -1));
withoutLodash = arrayOfObjects.filter(obj => listToDelete.indexOf(obj.id) === -1);
带过滤器和放大器包括
withLodash = _.filter(arrayOfObjects, (obj) => (!listToDelete.includes(obj.id)))
withoutLodash = arrayOfObjects.filter(obj => !listToDelete.includes(obj.id));
user3437231 answered 2019-07-17T23:40:23Z
0 votes
如果您喜欢简短的自我描述性参数,或者您不想使用splice并使用直接过滤器,或者您只是像我这样的SQL人员:
function removeFromArrayOfHash(p_array_of_hash, p_key, p_value_to_remove){
return p_array_of_hash.filter((l_cur_row) => {return l_cur_row[p_key] != p_value_to_remove});
}
以及样本用法:
l_test_arr =
[
{
post_id: 1,
post_content: "Hey I am the first hash with id 1"
},
{
post_id: 2,
post_content: "This is item 2"
},
{
post_id: 1,
post_content: "And I am the second hash with id 1"
},
{
post_id: 3,
post_content: "This is item 3"
},
];
l_test_arr = removeFromArrayOfHash(l_test_arr, "post_id", 2); // gives both of the post_id 1 hashes and the post_id 3
l_test_arr = removeFromArrayOfHash(l_test_arr, "post_id", 1); // gives only post_id 3 (since 1 was removed in previous line)
Mehmet Kaplan answered 2019-07-17T23:40:50Z
0 votes
在给定数组中通过它的id删除对象;
const hero = [{'id' : 1, 'name' : 'hero1'}, {'id': 2, 'name' : 'hero2'}];
//remove hero1
const updatedHero = hero.filter(item => item.id !== 1);
Naresh Chennuri answered 2019-07-17T23:41:15Z
es6删除对象的属性_javascript - 按对象属性从数组中删除对象相关推荐
- 如何获取数组中嵌套对象中属性值不为空的对象?
如何获取数组中嵌套对象中属性值不为空的对象? 有一个对象数组如下: let arr = [ {id:1,aa:'aa1'}, {id:2,aa:'aa2',bb:{ cc:{dd:12} }}, {i ...
- JS 中对数组按照数组中某个对象的属性值进行排序
最近遇到了按照数组中某个对象的属性值进行排序的需求,找了很多种方式,下面这个完美解决: arr是数组名,attr是数组某个对象的属性 完美解决~~ 转载于:https://www.cnblogs.co ...
- js删除数组中指定对象
js删除数组中指定对象 需求说明 从数组中移除指定对象函数封装 `removeArray` 从数组中获取指定对象索引函数封装 `getArrayIndex ` 在`Vue`中调用函数使用 需求说明 点 ...
- vue+js 从一个数组中删除在另一个数组中已存在对象;
数组,对象常用的删除方法: 1.根据一个数组元素,删除另一个数组中的对象: var a = [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 1 ...
- 微信云开发云数据库,数组中添加对象,修改数组中对象,删除数组中对象
添加 向data数组中添加对象,代码如下,event._id,event.data,id要在哪条数据中添加对象,data为字段push为添加 ` const db = cloud.database() ...
- 微信小程序更新二维数组中的对象或数组的属性值
微信小程序更新二维数组中的对象或数组的属性值,这里可能有两种情况 1.微信小程序更新二维数组中的对象的属性值 更新二维数组中的某个对象的属性值,代码如下 js 代码 data: {familys:[{ ...
- JS删除数组中指定元素/删除数组中指定对象
删除数组中指定对象指定元素 let arr = [{name: "xiaowang",id: 1 },, {name: "xiaozhang",id: 2 }, ...
- 删除数组中某个指定元素或删除数组中某个对象元素
ES6--删除数组中某个指定元素或删除数组中某个对象 1.删除数组中某个指定元素 2.删除数组中的某个对象 1.删除数组中某个指定元素 let index = this.array.indexOf(n ...
- win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝)
win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝) 参考文章: (1)win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝) (2)http ...
最新文章
- 【2-SAT问题】解题报告:POJ 3678 Katu Puzzle(2-SAT问题的判定)
- Java Ant 学习总结
- 通过源码告诉你,阿里的RocketMQ事务消息到底牛逼在哪?
- Py之dlib:Python库之dlib库的简介、安装、使用方法详细攻略
- 广东计算机学会 信息学省初赛,报名丨2019第36届全国信息学奥林匹克竞赛于广州二中举办!...
- 取消hover效果_CSS3 transition过渡动画效果
- c++string类的相关操作
- java exception 包_什么是Java中的异常包装?
- 云中漫步——迎接云计算时代的到来
- 不恢复余数除法原理_小学数学基础概念大全,家长收藏起来,一条一条讲给孩子听。能全背下来的,考试也不带怕的了!...
- 一、Maven-单一架构案例(创建工程,引入依赖,搭建环境:持久化层,)
- 超级简单的 RocketMQ 流量削峰实战
- 有时感觉自己很是虚伪
- 2021年中国空气净化器市场现状分析,线上趋势明显,市场渗透率仍有较大发展空间「图」
- java获取前四个季度结束日期_JAVA使用LocalDate获取当前日期所在季度的开始日期和结束日期...
- mapbox 地图开发遇见问题 图层未清理
- stm32f103rbt6_2
- php判断运营商,PHP如何实现根据手机号判断运营商(实例)
- 基于Qt的海康威视网络摄像头SDK的二次开发——摄像头登录和预览
- 企业直播中场战事:270万家用户企业会选择谁?
热门文章
- js做简易ATM机-pink老师的作业
- CE MAPI学习(-)开始一个MAPI Session
- RNA-seq(2):下载参考基因组及基因注释,及测序数据-学习笔记
- 快手电商金牛小店自动下单协yi分析
- Android应用数据清理命令(adb clear)的使用执行报错问题解决
- WWDC后苹果审核指南更新多达158处!最全详解,收藏这一篇就够了
- ubuntu新增固态硬盘的方法
- ANA 2 优化版含预设 – Sonic Academy ANA 2 Bundle v2.0.94 WiN
- ${}什么意思在web开发中
- ftp查看根目录对应的linux目录位置