Как передать свойство объекта в качестве параметра? (JavaScript) - программирование
Подтвердить что ты не робот

Как передать свойство объекта в качестве параметра? (JavaScript)

Я не уверен, соответствует ли название тому, чего я пытаюсь достичь

Я сопоставляю результаты JSON с массивом. Поскольку мне нужно делать это снова и снова, я хотел бы поместить код в одну функцию.

В следующих примерах я повторяюсь. У меня есть свойства, называемые item.data1, item.data2, а во втором примере item.something1, item.something2... Как передать эти свойства как "общие" аргументы вновь созданной функции, чтобы использовать их там, а не повторите, чтобы вернуть эти карты? Новая функция должна использоваться для двух приведенных ниже примеров, а также для других случаев, когда свойства могут иметь разные имена.

service.getData(function(data) {
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        entry.key = item.data1;
        entry.value = item.data2;

        return entry;
    });
});

service.getSomething(function(data) {
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        entry.key = item.something1;
        entry.value = item.something2;

        return entry;
    });
});
4b9b3361

Ответ 1

используйте [] со строкой, чтобы динамически извлекать свойства из объектов.

var a = { foo: 123 };
a.foo    // 123
a['foo'] // 123

var str = 'foo';
a[str]   // 123

Это означает, что мы можем реорганизовать ваш метод так, просто передайте имена свойств, которые вы хотите читать как строки.

var getKeyValueMap = function(data, keyPropName, valuePropName) {
  return $.map(data, function(item, i) {
    return {
      key:   item[keyPropName],
      value: item[valuePropName]
    }
  });
};

service.getData(function(data) {
  return getKeyValueMap(data, 'data1', 'data2');
});

service.getSomething(function(data) {
  return getKeyValueMap(data, 'something1', 'something2');
});

Ответ 2

это можно сделать с помощью операторов [] вместо . -нотации, как в этой скрипте, созданной именно для вас: D:

    var data = [{
        data1: 'foo',
        data2: 'bar',
        something1: 'sparky',
        something2: 'arf arf!'},
    {
        data1: 'My name is',
        data2: 'What?',
        something1: 'my name is',
        something2: 'Who?!'}
    ];

    function test(data, prop) {
        var d_length = data.length;
        for (var i = 0; i < d_length; i++) {
            alert(data[i][prop]);
        }
    }

    test(data, 'data1');

Ответ 3

Вам нужно будет передать объект item и карту ключей элементов к клавишам ввода. Это может быть либо два массива, массив кортежей, либо что-то, или объект. Самый простой метод, о котором я мог подумать, - это изменить объект дескриптора в самой записи:

function mapPropertyNames(source, dest) {
    for (var prop in dest)
        dest[prop] = source[dest[prop]];
    return dest;
}

// and use it like this:

var map = $.map(data, function(item, i) {
    return mapPropertyNames(item, {key:"something1", value:"something2"});
});

Ответ 4

Что-то вроде

service.getData(function(data) {
    var map = {};
    var varNamePrefix = 'data';
    map = $.map(data, function(item, i) {
        return getProperties(item, varNamePrefix);
    });
});

service.getSomething(function(data) {
    var map = {};
    var varNamePrefix = 'something';
    map = $.map(data, function(item, i) {
        return getProperties(item, varNamePrefix);
    });
});

function getProperties(item, varNamePrefix) {
    var ret = {};
    ret.key = item[varNamePrefix + '1'];
    ret.value = item[varNamePrefix + '2'];
    return ret;
}

Может помочь?

В принципе, вы можете использовать функцию, которая принимает префикс свойства и использует ее для формирования фактических имен свойств для получения из элементов.

Ответ 5

попробуйте следующее:

service.getData(function(data, props) {// props is a property object
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        for (var key in props) {
            entry[key] = item[key]
        }

        return entry;
    });
});

или использовать массив свойств

service.getData(function(data, props) {// props is like ['data1', 'data2']
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        for (var j = 0, k = props.length; j < k; j++) {
            entry[props[j]] = item[props[j]]
        }

        return entry;
    });
});