Javascript:如何将动态键插入地图/对象?

时间:2016-11-12 10:03:14

标签: javascript object dictionary maps

我是一名JS初学者,正在做基础教程。我正在尝试执行zip函数以返回{videoID:bookmarkID}的列表。举个例子来说:

var videos = [
        {
            "id": 70111470,
            "title": "Die Hard"
        },
        {
            "id": 654356453,
            "title": "Bad Boys"
        },
        {
            "id": 65432445,
            "title": "The Chamber"
        }
    ],
    bookmarks = [
        {id: 470, time: 23432},
        {id: 453, time: 234324},
        {id: 445, time: 987834}
    ];
}

这不起作用(我得到了意外的令牌'。'):

return Array.zip(videos,bookmarks, function(v, b){
  return {v.id: b.id};
});

确实如此,但会返回一个包含{' v&#39 ;: bookmarkID}的列表:

return Array.zip(videos,bookmarks, function(v, b){
  return {v: b.id};
});

如何将视频ID作为值bookmarkID的关键?另外,这些是技术上的地图还是物体?感谢。

3 个答案:

答案 0 :(得分:2)

尝试:

return Array.zip(videos,bookmarks, function(v, b){
  return {[v.id]: b.id};
});

答案 1 :(得分:1)

您可以映射一个并使用相同的索引获取另一个的元素。



var videos = [{ "id": 70111470, "title": "Die Hard" }, { "id": 654356453, "title": "Bad Boys" }, { "id": 65432445, "title": "The Chamber" }],
    bookmarks = [{ id: 470, time: 23432 }, { id: 453, time: 234324 }, { id: 445, time: 987834 }],
    zipped = videos.map(function (v, i) {
        var o = {};
        o[v.id] =  bookmarks[i].id;
        return o;
    });

console.log(zipped);

.as-console-wrapper { max-height: 100% !important; top: 0; }




ES6



var videos = [{ "id": 70111470, "title": "Die Hard" }, { "id": 654356453, "title": "Bad Boys" }, { "id": 65432445, "title": "The Chamber" }],
    bookmarks = [{ id: 470, time: 23432 }, { id: 453, time: 234324 }, { id: 445, time: 987834 }],
    zipped = videos.map((v, i) => ({ [v.id]: bookmarks[i].id }));

console.log(zipped);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 2 :(得分:0)

您的第一次尝试无效,因为您使用的对象的键不正确。使用对象文字定义对象时,键必须是数字或字符串文字。

另一方面,您可以使用类似数组的表示法在对象中创建该键来解决该问题。在JS中,有两种方法可以访问对象中的键的值:使用点表示法或类似数组的表示法。类似数组的表示法允许您访问直到运行时才确定的对象的键(作为变量的键)。例如:



    <script type="text/javascript">
      $("button.glass_btn").on("click",function(){
      $(this).closest("tr").remove();
})
</script>
&#13;
&#13;
&#13;

如果您感兴趣,两者之间的表现差异不大。

回到你的问题。 Zip是一个函数,用功能程序员的话来说,它采用一对列表并创建一对列表。从我的观点(以及我认为的功能观点)来看,以与你所做的不同来解决它可能更明智。

例如(并且只是作为一个简单的想法),你可以创建一个执行zip(典型的zip)的函数,并将结果应用于另一个函数,该函数选择你感兴趣的值:

&#13;
&#13;
var obj = {};
for(var i = 0; i < 3; i++)
  obj[i] = i + 1;
console.log(obj);
&#13;
&#13;
&#13;

我使用递归制作了一个简单的zip(有最佳方法可以做到这一点,也可以考虑到列表可以有不同的大小),但我认为它可以帮助你掌握这个想法。

希望有所帮助