【问题标题】:Get a slice of a Javascript Associative Array? [duplicate]获取 Javascript 关联数组的一部分? [复制]
【发布时间】:2011-05-23 00:22:00
【问题描述】:

我在 Javascript 中有一个关联数组对象,我只需要它的一部分。对于常规数组,我只会使用 slice 来获取我需要的部分,但显然这不适用于关联数组。是否有任何内置的 Javascript 函数可用于仅返回该对象的一部分?如果没有,这样做的最佳做法是什么?谢谢!

【问题讨论】:

  • 首先,告诉我们您存储在其中的数据类型以及您需要如何处理它。是多维的吗?需要订购吗?有关特定需求的一些详细信息会有所帮助。
  • 是的,我在整个站点都使用 jQuery。
  • @meder:基本上,我在分面导航中有一个选项列表,用于存储用户的偏好。因此,它基本上是一个选中或未选中的复选框列表,我试图记住这些值。但是,这个关联数组还包含了与页面相关的其他信息,所以我只需要其中的一部分。我正在使用关联数组,因此可以使用键来引用复选框的 id。
  • @Ivo: 抱歉,我是个新手:P

标签: javascript arrays associative-array


【解决方案1】:

没有“切片”对象的好方法,不,但如果你真的必须这样做,你可以这样做:

var myFields = ['field1', 'field2', 'field3'];

var mySlice = {};

for (var i in myFields) {
  var field = myFields[i];

  mySlice[field] = myOriginal[field];
}

【讨论】:

  • 缺少 hasOwnProperty... 在 3...2...1... 内爆炸 ;)
  • 嗯,所以基本上我只需要遍历对象属性?由于我的对象在切片对象中具有我需要的所有属性,所以我不能在循环时增加一个 int 并只获得我需要的数字吗?即 if (i > 0 && i
  • @IvoWetzel 如果页面上的代码在 Object 原型上添加了可枚举属性,那么这就是他们自己的错误!
  • @Raynos 穷人使用 Prototype 怎么样? :P
  • @David Savage - 本质上,是的,你循环遍历你知道你需要的那些并将它们添加到你的“切片”中。您当然可以在递增 int 的同时循环,但根据原始对象的大小,您最终可能会受到性能损失(如果您有 1000 个项目要检查并且需要 10 个,那么您将执行 990 次额外检查)。如果他们安排得方便,你可以尽早打破循环以避免一些惩罚。
【解决方案2】:

我使用了一个小功能:

/**
 * Slices the object. Note that returns a new spliced object,
 * e.g. do not modifies original object. Also note that that sliced elements
 * are sorted alphabetically by object property name.
 */
function slice(obj, start, end) {

    var sliced = {};
    var i = 0;
    for (var k in obj) {
        if (i >= start && i < end)
            sliced[k] = obj[k];

        i++;
    }

    return sliced;
}

【讨论】:

    【解决方案3】:

    我已经创建了this gist,它就是这样做的。它返回一个只包含提供的参数的新对象,并保持旧对象不变。

    if(!Object.prototype.slice){
        Object.prototype.slice = function(){
            var returnObj = {};
            for(var i = 0, j = arguments.length; i < j; i++){
                if(this.hasOwnProperty(arguments[i])){
                    returnObj[arguments[i]] = this[arguments[i]];
                }
            }
            return returnObj;
        }
    }
    

    用法:

    var obj = { foo: 1, bar: 2 };
    
    obj.slice('foo'); // => { foo: 1 }
    obj.slice('bar'); // => { bar: 2 }
    obj;              // => { foo: 1, bar: 2 }
    

    【讨论】:

    • 还有the opposite (except) available。它直接作用于对象,而不是返回一个新副本。
    • 感谢 zykadelic,这对我帮助很大。
    • @DanielLoureiro 我很高兴 :)
    猜你喜欢
    • 2013-11-14
    • 2012-06-15
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多