删除对象属性类似于使用splice删除数组元素?

时间:2013-08-23 09:12:51

标签: javascript jquery object

我们在Jquery中有对象类型变量:

var obj = *{"1234" : "xx", "4321" : "yy", "5555" : "hh", "2321" : "aa" };*

假设我想删除属性名称“5555”中的每个属性到对象的末尾(这意味着我想要delete obj['5555']delete obj['2321'])。 我对最聪明的方式感兴趣,通过循环来做到这一点。

在数组中我会使用splice(2, arr.length),但我很困惑。

5 个答案:

答案 0 :(得分:1)

无法保证对象属性的顺序。在我的控制台中粘贴示例对象时,这就是我所看到的:

> 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';

无论如何,数字索引被内部强制转换为字符串(因为Array是对象),所以JS不会为你创建无穷无尽的空索引,它会解析obj[200]就像解析objectLiteral.undefinedProperty一样:扫描实例,然后prototypechain。如果找不到请求的属性,则返回undefined。

随着你的进展,它们会被添加,但这里有两种方式:

//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]];
}

答案 1 :(得分:0)

我建议您获取要从中开始删除元素的元素的索引,然后循环抛出删除具有更高索引的元素的对象。

您可能想要创建一个函数,使其更类似于您喜欢的splice

答案 2 :(得分:0)

找到您要查找的元素,并将该特定元素及其后的任何元素设置为null

答案 3 :(得分:0)

将要搜索的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:值得指出的是,新属性以字母数字顺序添加到对象中,而不是像元素添加到数组中那样添加到对象的末尾。所以不要被那个抓住。

答案 4 :(得分:0)

删除属性名称非常棘手但是属性值可以为null或未定义但是删除属性很困难但是你可以做一件事可以在新对象中复制所需的属性它的变通方法虽然这里是一个示例小提琴我使用这个经常在这种情况下

    objCopyTo[strToPropertyName] = objCopyFrom[strPropertyName];

here是小提琴