Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从键值对数组创建对象?_Javascript - Fatal编程技术网

Javascript 如何从键值对数组创建对象?

Javascript 如何从键值对数组创建对象?,javascript,Javascript,在Python中,可以将一系列键值对传递给dict1构造函数: >>> dict([['name', 'Bob'], ['age', 42], ['breakfast', 'eggs']]) {'age': 42, 'name': 'Bob', 'breakfast': 'eggs'} 除了定义自己的函数外,我想不出用JavaScript做这类事情的任何方法: function pairs_to_object(pairs) { var ret = {}; pa

在Python中,可以将一系列键值对传递给
dict
1构造函数:

>>> dict([['name', 'Bob'], ['age', 42], ['breakfast', 'eggs']])
{'age': 42, 'name': 'Bob', 'breakfast': 'eggs'}
除了定义自己的函数外,我想不出用JavaScript做这类事情的任何方法:

function pairs_to_object(pairs) {
    var ret = {};
    pairs.forEach(function (p) { ret[p[0]] = p[1]; });
    return ret;
}
但我是一个无赖。。。这种排序对到对象的转换有内置的东西吗

1就这个问题而言,我将Python DICT视为Python与JS对象的对应物,当然,相似性仅限于它们都是键值集合。

在撰写本文时(2013年),JavaScript对象/字典/关联数组本机没有这样的构造函数

正如您自己所说,您当然可以使用函数方法构建自己的函数,例如使用
reduce
函数,如其他答案之一所述。当然,一个经典的for或更新的forEach循环也可以工作。但是没有任何内置的东西



编辑:现在是2019年,我们有了,这将为您提供您所需要的

Javascript没有一个本机函数,可以按照您描述的方式将数组转换为对象。但是,这是因为没有必要这样做。您已经在问题中包含了一个示例解决方案,您可以自己定义函数,但这并不是必需的。只要您能确保输入数组是正确的,您甚至可以使用一个简单的for循环进行转换,如下所示:

var input = [['name', 'Bob'], ['age', 42], ['breakfast', 'eggs']];
var output = {};
for(i in input) output[input[i][0]] = input[i][1];
这是最基本的代码

当然,(正如mamapitufo指出的)实际上使用..in来迭代数组通常是个坏主意,因为这也会返回非索引作为i的值。不过,问题是,这种操作太简单,而且很少需要,无法证明有一个本机函数是正确的


python dict是javascript中不需要的一种结构,因为这两种语言的类型和总体设计方法不同,因此对一种语言有用的东西对另一种语言没有用处。虽然您可以使用python中使用的相同方法和结构,但考虑如何利用javascript的不同方式可能是一个更好的主意-也许您会发现,您根本不需要dict。

您可以使用reduce函数

x = [[1,2],[3,4],[5,6]];
o = x.reduce(function(prev,curr){prev[curr[0]]=curr[1];return prev;},{})
o现在相当于
{1:2,3:4,5:6}

如果您的输入数组是稀疏的,则需要在赋值上添加
If(curr!=undefined)
测试,但请确保仍然返回“prev”

如果元组比simple[key,value]更复杂,您可以简单地更改“prev”的赋值方式。例如:
prev[“key-”+curr[0].toString()]=curr[1]*2

执行此任务。它是使用ECMAScript 2019添加到语言中的

如果您不支持该功能,您可以使用以下ES2015代码自己定义它:

Object.fromEntries = arr => Object.assign({}, ...Array.from(arr, ([k, v]) => ({[k]: v}) ));
一件好事是,此方法与(ES2017)相反,因此现在您可以在对象和数组表示之间来回切换:

const arr=[['name','Bob'],['age',42],“早餐”,“鸡蛋”];
const obj=Object.fromEntries(arr);
控制台日志(obj);
// ... 返回:
const arr2=对象条目(obj);
console.log(arr2);//原始数组的副本(省略重复键)
.as控制台包装{max height:100%!important;top:0;}
Lodash的函数将执行以下操作:

const _ = require('lodash')
const kvPairs = [['a', 1], ['b', 2]]
_.fromPairs(kvPairs)
// => { a: 1, b: 2 }
Object.fromEntries()
对象
对象上有一个名为
Object.fromEntries(iterable)
的方法。iterable对象中的迭代器对象必须生成一个包含2个元素的数组。第一个(索引0)数组元素是对象键,第二个是值

MDN非常准确地描述了这一点:

Object.fromEntries()
方法获取键值对和 返回一个新对象,其属性由这些条目给定。这个 iterable参数应为实现
@@iterator
方法,该方法返回一个迭代器对象,该对象生成 类似于数组的两元素对象,其第一个元素是 将用作属性键,其第二个元素是值 以与该属性键关联


如何使用: 为了使用
object.fromEntries()
方法,您甚至不需要知道iterable对象的细节。始终可以在以下对象上使用该方法:

  • 二维数组,其中内部/嵌套数组有2个元素
  • 地图
以下是一个例子:

//映射示例:
常量映射=新映射([['hi','there',['foo',2]]);
const objFromMap=Object.fromEntries(map);
console.log(objFromMap);//{你好:“那里”,福:2}
//阵列示例:
常量数组=['0','00'],['1','11'],['2','22'];
const objFromArray=Object.fromEntries(数组);

console.log(objFromArray);//{0:“00”、1:“11”、2:“22”}
“是否有任何内置内容可用于此排序对到对象的转换?”不在普通JavaScript中。一些库提供了它:有一个ES将其作为
对象添加到JS中。fromEntries
。这与ES2017中添加到JS中的函数相反。ES5中有一个
数组.prototype.forEach
:使用'for。。在'中,不建议在JavaScript中迭代数组中的元素:@mamapitufo您完全正确,谢谢,我已经编辑了答案以澄清我想说的内容。>python dict是JavaScript中不需要的结构真的吗?所以,目前我有一个键值对列表。我有一个,其中的每个值都是键,该值用于的数据。我希望能够快速查找与该值关联的键值中的数据。除了在数组上迭代外,没有其他方法可以做到这一点?@Lucretiel在