如果我不知道数组键/索引,如何使用对象访问数组?

时间:2019-01-19 16:40:21

标签: javascript

我有一个数组,其中有对象。我需要使用它并需要访问对象数据。

以下是此数组的示例:

var result <-
(16)array […]
​
0:object {…}"myobjectname1": {…}    style_name: "border-top-right-radius"
​​​                                        style_unit: "px"
​​​                                        style_value: "0"
​​​
1:object {…}"myobjectname2": {…} style_name: "border-bottom-right-radius"
        ​​​                                style_unit: "px"
​​​                                        style_value: "0"
​​​
2:object { "myobjectname3": {…} }
​
3:object { "myobjectname4": {…} }
​
4:object { "myobjectname5": {…} }
...

我想通过对象名直接访问不同的对象

示例alert("result.myobjectname1.style_name");

这似乎行不通,因为在这种情况下[0],我无法通过索引访问数组!?

我不知道这个索引,每次可能都不同。

有没有一种方法可以通过对象名直接访问对象,或者必须以一种方式创建可以工作的数组/对象?

在php中,我将使用一个简单的数组来完成此操作,在JavaScript中,这是不可能的,因为我的索引是字母数字。

更新

这是我在每个循环中创建数据的方式

var match=new Array();
each(...)
{
...
  var r = null;
  r={ [myobjectname_from_variable] :  {     'style_name': res_stylename,
                                            'style_value': res_stylevalue,
                                            'style_unit' : elem_styleunit} };

  match.push(r); 
...
}

重要提示:myobjectname_from_variable的值与res_stylename相同,并且包含“ border-top-right-radius”之类的内容

在这里,我们必须考虑如何在javascript中调用它。例如

object.border-top-right-radius.style_value 

不会breack并返回未定义的“正确”错误...

2 个答案:

答案 0 :(得分:2)

您可以使用数组的所有对象来构建对象。然后以所需对象的密钥进行访问。

.as-console-wrapper {
  max-height: 100% !important;
}
string[] rest = new string[] { null, null, tableName, null };
DataTable rows = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, rest);
foreach (DataRow rr in rows.Rows)
{
    string tbrow = rr["COLUMN_NAME"].ToString();
    int colnum_type = Int32.Parse(rr["DATA_TYPE"].ToString());
    string datatype = get_dataType(colnum_type)
}

要通过键更快地访问,可以使用已定义的对象(例如

)来构建对象
var array = [
        { foo: { id: 1, name: 'foo' } },
        { bar: { id: 2, name: 'bar' } },
        { baz: { id: 3, name: 'baz' } }
    ],
    object = Object.assign(...array);

console.log(object.foo.id);
console.log(object);

在循环中,您可以像这样用property accessor

分配值对象
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

您最好的选择是迭代数组,然后调用每次迭代的索引。还有一个名为.forEach的数组方法,可以为您解决这个问题。

var yourArray = []; // contains the array of objects you mentioned
yourArray.forEach(object => {
    const key = Object.keys(object)[0];
    alert(object[key].style_name);
})

更新

您的主要问题是密钥中使用连字符。如果要为这样的对象建立索引,则需要将键作为字符串引用。

const obj = {'border-top-right-radius':'style_value'};
const test = obj['border-top-right-radius'];
console.log(test); // this logs 'style_value '

const other = obj.border-top-right-radius; 
// This will throw that 'right' is undefined.

如果要使用该格式,则将连字符更改为下划线。有了下划线,就可以根据需要直接引用它们。您稍后可以轻松地将.replace

重新映射到带连字符的字符串
const underscoreReplacement = 'border_top_right_radius';
const actualSheetValue = underscoreReplacementreplace(/_/g, '-');
console.log(actualSheetValue); // logs 'border-top-right-radius'