1

重複の可能性:
動的オブジェクトのプロパティ名

オブジェクトのプロパティへのアクセスを動的に生成したい。

アクセスしようとすると、が表示されmydata[i].val.nameますsomename

mydata[i] + bar[j](bar [j] ==='.val.name')のように試してみると、失敗します。

このようなものを動的に作成するにはどうすればよいですか?ユーザーが生成した値を使用してオブジェクトの任意のプロパティにアクセスできるようにするには?


いくつかのコード:

オブジェクトがある場合は、そのプロパティを反復処理して、関心のあるオブジェクトを収集できるようにします。理想的には、次のようなものが必要です。

var processData = function (data, keys, values) {
  var returnData = [], i, j, k;
  var parsedData = JSON.parse(data);
  var keys = keys || null;
  var values = values || null;
  var datalen = parsedData.length;

  for (i = 0; i < datalen; i++) {
      returnData[i] = {};
      for(j = 0; j< keys.length; j++){
          for(k = 0; k < values.length; k++){
              returnData[i][keys[j]] = parsedData[i] + values;
          }
      }
  }

  return returnData;
};

そしてそれを次のように使用します:

var keys = ["foo","bar"];
var values = [".val.name", ".val.date"];
processData(data, keys, values);

しかし、これは機能せず、コンソールfoo="[object Object].val.name"では予想よりも表示されfoo="ACME Industries"ます。

4

3 に答える 3

1

試してみると:

new Object() + '.john.doe'

文字列として連結されるため、を取得します"[object Object].john.doe"

代わりに、動的プロパティ名を処理できる関数を作成する必要があります(そしてそれらはたくさんあります)。また、".foo.bar"構文を文字列として失い(使用する予定がない限りeval())、代わりに配列のみを操作することもできます。

于 2012-08-31T07:30:09.723 に答える
1

下付き文字をドットを含む文字列として構築するパターンに固執したい場合は、次のように独自のルックアップ関数をロールする必要があります。

function descend(object, sub) {
    var handle = object,
        stack = sub.split('.'),
        history = [],
        peek;

    while (handle[stack[0]]) {
        if (peek) {
            history.push(peek);
        }
        peek = stack.shift();
        handle = handle[peek];
    }

    if (stack.length > 0) {
        history.push(peek);
        throw "Traversal error, could not descend to '" + stack.join('.') + "' from '" + history.join('.') + "'.";
    }

    return handle;
}

var x = {
    a: {
        b: {
            c: 15
        },
        d: 4
    }
};

console.log(descend(x, "a"));
console.log(descend(x, "a.b"));
console.log(descend(x, "a.b.c"));
console.log(descend(x, "a.d"));

function processData(data, keys, values) {
    if (keys.length !== values.length) {
        throw "Mismatched keys and value lookups";
    }

    var i,
        len = keys.length,
        gathered = {},
        k,
        scratch,
        v;

    for (i = 0; i < len; i += 1) {
        k = descend(data, keys[i]);
        scratch = values[i].split('.');
        scratch.shift();
        v = descend(k, scratch.join('.'));
        gathered[keys[i]] = v;
    }

    return gathered;
}

var data = {
    foo: {
        val: {
            name: "ACME Industries"
        }
    },
    bar: {
        val: {
            date: (new Date())
        }
    }
};
var keys = ["foo","bar"];
var values = [".val.name", ".val.date"];
processData(data, keys, values);

注意: これは、このスタイルのルックアップを使用しないコーディングほど効率的ではありません。

于 2012-08-31T07:30:28.617 に答える
0

私が正しく理解している場合は、使用する必要があります

mydata[i]["val"]["name"]

したがって、次のようなものを使用します。

var result =getItemByValuesPath(myData[i],values);
alert(result);

function getItemByValuesPath(item, values)
{
    var result = item;

    var vals = values.split(".");
    for(var j=0; j<values.length; j++)
    {
        if(result==undefined)
            {
                    return null;
            }
    result = result[values[j]];
    }
}
于 2012-08-31T07:33:49.473 に答える