JavaScript. 从关联数组中提取值

3
我该如何在JavaScript中获取这个关联数组的值?
我只需要电子邮件地址,而不是标签。
(
  {
    office = ("my@email.com");
    home = ("ahome@anotheremail.com");
    work = ("nothing@email.com");
  },
  {
    home = ("test@test.se");
  }
)

更新:首选输出格式为JSON:

{
    "data": [
        {
            "email": "my@email.com"
        },
        {
            "email": "ahome@anotheremail.com"
        },
        {
            "email": "nothing@email.com"
        },
        {
            "email": "test@test.se"
        }
    ]
}

感谢所有的反馈!

6个回答

4
您可能想要做的是:

var x = [{
 office: ("my@email.com"),
 home: ("ahome@anotheremail.com"),
 work: ("nothing@email.com")
},
{
 home: ("test@test.se")
}]

并且:

for(var j = 0; j < x.length; j++)
{
    for(var anItem in x[j])
    {
        console.log(x[j][anItem])
    }
}

//编辑: 然而,使用 for ... in 并不是最佳实践。参考:这里
也许你可以改变你的数据结构为:
var x = [[{
        value: "my@email.com",
        type: "office"
    },
    {
        value: "ahome@anotheremail.com",
        type: "home"
    },
    {
        value: "nothing@email.com",
        type: "work"
    }],
    [{
        value: "test@test.se",
        type: "home"
    }]];

使用以下方法进行迭代:

for( var i = 0, xlength = x.length; i < xlength; i++ )
{
    for( var j=0, ylength = x[i].length; j < ylength; j++ )
    {
        console.log(x[i][j].value);
    }
}

我无法更改数据结构。我正在使用Appcelerator开发iPhone应用程序,当我从内置通讯录请求信息时,会得到以下结果。最好的方法是能否以JSON格式获取最终输出(仅地址)。这可能吗? - Jonathan Clark
当前的输出为:[["my@email.com"],["ahome@anotheremail.com"],["nothing@email.com"],["test@test.se"]],格式为JSON。如果能够改为{"data": [{"email": "my@email.com"},{"email": "ahome@anotheremail.com"},{"email": "nothing@email.com"},{"email": "test@test.se"}]},那就太棒了。这个可行吗? - Jonathan Clark

4
这是一行代码:
console.log(Object.keys(assoc).map(k => assoc[k]));

这里的 assoc 是您的关联数组。

编辑

我在这里有一个更好的答案。


1
您可以使用“foreach”遍历对象以获取其属性:
for(var j = 0; j < mySet.length; j++)
{
    for(var propName in mySet[j])
    {
        var emailAddress = mySet[j][propName];
        // Do Stuff
    }
}

我在上面的代码中遇到了一个错误(myObj),将其更改为mySet,并对emailAddress进行了警告,但每个警告都是空的。出了什么问题? - Jonathan Clark
这次完美地运行了!谢谢!是否有可能将所有标签重命名为相同的名称,例如单词“电子邮件”而不是“工作”? - Jonathan Clark
您可以将这些值转换为您选择的另一个对象。 - Tejs
当前的输出是:[["my@email.com"],["ahome@anotheremail.com"],["nothing@email.com"],["test@test.s­e"]],格式为JSON。如果能够改成这样就很好了:{"data": [{"email": "my@email.com"},{"email": "ahome@anotheremail.com"},{"email": "nothing@email.com"},{"email": "test@test.se"}]}。这个可行吗? - Jonathan Clark

0

编辑后的问题答案:

var ret = {data: []};

for(var j = 0; j < x.length; j++)
{
    for(var anItem in x[j])
    {
        ret.data.push({
            email: x[j][anItem]
        });
    }
}

console.log(ret);

结果保存在ret中。


0

请提供与问题相关的具体答案。 - Ray Coder

0

你的输入是 JSON 格式吗?如果是,那么这是错误的语法。

let _in = [
 {
   office : "my@email.com",
   home : "ahome@anotheremail.com",
   work : "nothing@email.com",
 },
 {
   home : "test@test.se"
 }
]

let _out = []
_in.forEach( record => {  
   _out =  _out.concat(Object.values(record).map(x => new Object({email : x})))
})

console.log(_out)

对于每个记录,我提取了值并将其“打包”到一个带有“电子邮件”属性的对象中,然后将从原始记录数组获得的所有这些数组合并在一起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接