Javascript 在对象中每隔两个关键点重新排列一次

Javascript 在对象中每隔两个关键点重新排列一次,javascript,object,Javascript,Object,如何操纵此对象以重新排列值 let obj = [ {foo: 10, bar: 20}, ["apple"], {foo: 30, bar: 40}, ["pear"], {foo: 50, bar: 60}, ["orange"] ] // The output should be: // { "apple": { foo: 10, bar: 20 }, "pear": {...}, "orange": {...} } 我已经尝试了这里提供的解决方案: 但这不会

如何操纵此对象以重新排列值

let obj = [
  {foo: 10, bar: 20},
  ["apple"],
  {foo: 30, bar: 40},
  ["pear"],
  {foo: 50, bar: 60},
  ["orange"]
]

// The output should be: 
// { "apple": { foo: 10, bar: 20 }, "pear": {...}, "orange": {...} }
我已经尝试了这里提供的解决方案:

但这不会输出所需的输出。

使用

让obj=[{foo:10,bar:20},[“苹果”],{foo:30,bar:40},[“梨”],{foo:50,bar:60},[“橙色”];
var result={};
对于(设i=0;i使用

让obj=[{foo:10,bar:20},[“苹果”],{foo:30,bar:40},[“梨”],{foo:50,bar:60},[“橙色”];
var result={};
对于(设i=0;i可用于将此数组缩减为对象。请参见下面的逻辑

让obj=[{foo:10,bar:20},[“苹果”],{foo:30,bar:40},[“梨”],{foo:50,bar:60},[“橙色”];
常数arr=obj.reduce((a,el,i,arr)=>{
if(el instanceof数组){
a[el[0]]=arr[i-1];
}
返回a;
}, {});
控制台日志(arr)可用于将此数组缩减为对象。请参见下面的逻辑

让obj=[{foo:10,bar:20},[“苹果”],{foo:30,bar:40},[“梨”],{foo:50,bar:60},[“橙色”];
常数arr=obj.reduce((a,el,i,arr)=>{
if(el instanceof数组){
a[el[0]]=arr[i-1];
}
返回a;
}, {});

控制台日志(arr)您可以使用array.reduce:

var obj=[
{foo:10,bar:20},
[“苹果”],
{foo:30,bar:40},
[“梨”],
{foo:50,bar:60},
[“橙色”]
];
var result=obj.reduce((m,o,i)=>(Array.isArray(o)和&(m[o[0]]=obj[i-1]),m),{});

控制台日志(结果)您可以使用array.reduce:

var obj=[
{foo:10,bar:20},
[“苹果”],
{foo:30,bar:40},
[“梨”],
{foo:50,bar:60},
[“橙色”]
];
var result=obj.reduce((m,o,i)=>(Array.isArray(o)和&(m[o[0]]=obj[i-1]),m),{});

控制台日志(结果)啊哈。意思:最后一个
i+=2
表示每两次迭代循环一次。然后,结果是包含第一个值(
obj[i]
)的第二个值(
obj[i]
)。为什么
[obj[i+1][0]]
exaclty?@Remi中的方括号是用来设置对象中的动态属性的。由于属性名位于变量中(在本例中为数组中的数组),因此要获取值,需要使用方括号。可能对您有帮助的参考很少:
[属性访问器](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors)
,似乎@void(和Faly)提出的obj.prototype.reduce方法性能更好。不确定我用来衡量绩效的方法是否具有代表性,但仍然如此。所以我倾向于接受这一最佳答案。如果你不同意,请告诉我。(感谢您提供的信息)@Remi-
reduce
将执行
n
迭代,而
for loop
将执行
n/2
迭代。因此,for循环具有更好的性能。您是对的。根据您的输入,还创建了一个JSPerf:。结果是for循环的性能提高了+/-16%。啊哈。意思:最后一个
i+=2
表示每两次迭代循环一次。然后,结果是包含第一个值(
obj[i]
)的第二个值(
obj[i]
)。为什么
[obj[i+1][0]]
exaclty?@Remi中的方括号是用来设置对象中的动态属性的。由于属性名位于变量中(在本例中为数组中的数组),因此要获取值,需要使用方括号。可能对您有帮助的参考很少:
[属性访问器](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors)
,似乎@void(和Faly)提出的obj.prototype.reduce方法性能更好。不确定我用来衡量绩效的方法是否具有代表性,但仍然如此。所以我倾向于接受这一最佳答案。如果你不同意,请告诉我。(感谢您提供的信息)@Remi-
reduce
将执行
n
迭代,而
for loop
将执行
n/2
迭代。因此,for循环具有更好的性能。您是对的。根据您的输入,还创建了一个JSPerf:。结果是for循环的性能提高了+/-16%。我不喜欢这种方法,因为会有
n/2
迭代,它们不会做任何有趣的事情。Nikhil的方法有什么好处?我不喜欢这种方法,因为会有
n/2
迭代,不会做任何有趣的事情。Nikhil的方法有什么好处吗?很抱歉,你的答案看起来很像@void的答案。很抱歉,你的答案看起来很像@void的答案。