Получите фрагмент ассоциативного массива Javascript?

У меня есть ассоциативный объект массива в Javascript, который мне нужен только частью. С регулярным массивом я просто использовал бы срез, чтобы получить нужную мне часть, но, очевидно, это не будет работать на ассоциативный массив. Есть ли встроенные функции Javascript, которые я мог бы использовать для возврата только части этого объекта? Если нет, то что будет считаться наилучшей практикой для этого? Спасибо!

Ответ 1

Не будет хорошего способа "нарезать" объект, нет, но вы могли бы сделать это, если бы вам действительно приходилось:

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

var mySlice = {};

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

  mySlice[field] = myOriginal[field];
}

Ответ 2

Я создал этот метод, который делает именно это. Он возвращает новый объект только с предоставленными аргументами и оставляет старый объект неповрежденным.

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 }

Ответ 3

Существует небольшая функция, которую я использую:

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