我们在 Jquery 中有对象类型变量:
var obj = *{"1234" : "xx", "4321" : "yy", "5555" : "hh", "2321" : "aa" };*
假设我想删除从属性名称“5555”到对象末尾的每个属性(这意味着我想要delete obj['5555']
和delete obj['2321']
)。我对最聪明的方式感兴趣,槽循环,做到这一点。
在数组中我会使用splice(2, arr.length)
但我很困惑。
我们在 Jquery 中有对象类型变量:
var obj = *{"1234" : "xx", "4321" : "yy", "5555" : "hh", "2321" : "aa" };*
假设我想删除从属性名称“5555”到对象末尾的每个属性(这意味着我想要delete obj['5555']
和delete obj['2321']
)。我对最聪明的方式感兴趣,槽循环,做到这一点。
在数组中我会使用splice(2, arr.length)
但我很困惑。
无法保证对象属性的顺序。在我的控制台中粘贴您的示例对象时,这是我看到的:
> obj = {"1234" : "xx", "4321" : "yy", "5555" : "hh", "2321" : "aa" }
Object {1234: "xx", 2321: "aa", 4321: "yy", 5555: "hh"}
如您所见,chrome 按升序对属性进行排序,就像数组一样。谁知道,但也许 IE 不这样做......也许一些不起眼的浏览器会按降序排列属性......没有办法知道实际对象会是什么样子,所以也许重新考虑一下。
如果你所有的属性本质上都是数字的,那么使用数组就没有错,在 JS 中,Array
原型只不过是一个增强的Object
:
obj = [];
obj[1234] = 'xx';
obj[2321] = 'aa';
obj[5555] = 'hh';
无论如何,数字索引在内部都被强制转换为字符串(因为数组是对象),所以 JS 不会为你创建无穷无尽的空索引,obj[200]
它会像解析一样解析objectLiteral.undefinedProperty
:扫描实例,然后是原型链。如果未找到请求的属性,则返回 undefined。
它们会随着您的进行而添加,但这里有 2 种方法:
//Assume simpel object (non-nested)
var newObj = JSON.parse(JSON.stringify(obj).replace(/\{|,\s*"5{4}"\s*:.+$/,'}'));
我认为这是最简单的方法,但不是很可靠。最“久经考验”的方法是:
var unset = false;
for (var prop in obj)
{
if (obj.hasOwnProperty(prop))
{
unset = unset || !!(prop === '5555');
if (unset === true)
{
delete(obj[prop]);
}
}
}
最后一种方法创建一个包含所有键的数组,您可以对其进行迭代,并以这种方式删除属性。它在这里只是为了完整起见:不过,我不会使用它,只是因为它需要支持 ES5 规范的浏览器(遗憾的是,并非所有浏览器都支持),并且与上面的代码相比没有真正的优势:
var keys = Object.keys(obj).sort(),//call sort to assure ascending order
toDelete = keys.splice(keys.indexOf('5555'), keys.length).sort();
for(var i=0;i<toDelete.length;i++)
{
delete obj[toDelete[i]];
}
将要搜索的 obj 和要找到的值推送到一个函数中,该函数返回一个新对象,该对象仅具有不超过您指定值的那些属性。
function returnNewobj(obj, value) {
var newObj = {};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (prop === value) return newObj;
newObj[prop] = obj[prop];
}
}
return newObj;
}
编辑:可能没有必要,但为了安全起见,我添加了 hasOwnProperty 行。
Edit2:值得指出的是,新属性是按字母数字顺序添加到对象的,而不是像元素添加到数组那样添加到对象的末尾。所以不要被它抓住。
删除属性名称非常棘手,但是可以将属性值设为 null 或未定义,但是删除属性很困难,但是您可以做一件事,可以将所需的属性复制到新对象中,这是一种解决方法,尽管这是一个示例小提琴,我经常在此使用一种情况
objCopyTo[strToPropertyName] = objCopyFrom[strPropertyName];
这是小提琴
我建议您获取要从中开始删除元素的元素的索引,然后循环抛出删除具有更高索引的元素的对象。
您可能想要创建一个函数以使其与splice
您喜欢的 i 更相似。
找到您要查找的元素并将该特定元素和之后的任何元素设置为null
.