如何在属性中搜索属性对象?
2015-02-12
260
我有这个对象:
key = {
spawn:{type:1,img:app.assets.get('assets/spawn.svg')},
wall:{type:2,img:app.assets.get('assets/wall.svg')},
grass:{type:3,img:app.assets.get('assets/grass.svg')},
spike:{type:4,img:app.assets.get('assets/spike.svg')},
ground:{type:5,img:app.assets.get('assets/ground.svg')}
};
我有一个只有类型的数组,我需要向其中添加给定的图像,该数组看起来像这样:
[{type:1,image:null},{type:3,image:null},{type:2,image:null},{type:2,image:null},{type:5,image:null}]
基本上我想循环数组,在关键对象中找到类型并获取给定的图像并将其保存到数组中。
有什么简单的方法可以做到这一点吗?
3个回答
对我来说,这里最突出的一行是
...get the given image and save it into the array
我假设这意味着原始数组。我认为更好的方法是将适当的键和值映射到新数组,但在本例中,我假设这是必需的。
为了使解决方案尽可能简洁,并要求使用 lodash 解决方案:
_.each(key, function(prop){
_.each(_.filter(types, { type: prop.type }), function(type) { type.image = prop.img });
});
garethdn
2015-02-19
给定键对象和一个对象数组,如下所示:
var key = {
spawn:{type:1,img:app.assets.get('assets/spawn.svg')},
wall:{type:2,img:app.assets.get('assets/wall.svg')},
grass:{type:3,img:app.assets.get('assets/grass.svg')},
spike:{type:4,img:app.assets.get('assets/spike.svg')},
ground:{type:5,img:app.assets.get('assets/ground.svg')}
};
var arr = [{type:1,image:null},{type:3,image:null},{type:2,image:null},{type:2,image:null},{type:5,image:null}];
我们可以首先创建对象
key
中的属性数组,以使其迭代更简单。
然后循环遍历数组
arr
,并针对每个成员,使用
some
循环检查哪个图像根据其类型属于该成员(some 在第一个
true
时返回并结束循环)。
如果您希望循环没有副作用,并且不改变原始数组,则可以将
forEach
更改为
map
(并将返回的新数组分配给
arr
或新变量)。
var keyTypes = Object.keys(key);
arr.forEach(function (item) {
keyTypes.some(function (keyType) {
if (key[keyType].type === item.type) {
item.image = key[keyType].img;
return true;
}
return false;
});
});
更聪明的做法是改变对象图像类型,以便您可以使用类型作为访问属性,或者为其创建另一个对象(如另一个答案所指出的那样)。
Olli K
2015-02-14
我不确定这个解决方案是否现代,但它不使用任何循环或递归。
object = {
spawn: {type:1, img:app.assets.get('assets/spawn.svg')},
wall: {type:2, img:app.assets.get('assets/wall.svg')},
grass: {type:3, img:app.assets.get('assets/grass.svg')},
spike: {type:4, img:app.assets.get('assets/spike.svg')},
ground: {type:5, img:app.assets.get('assets/ground.svg')}
};
arr = [
{type:1, image:null},
{type:3, image:null},
{type:2, image:null},
{type:2, image:null},
{type:5, image:null}
];
var typeImages = {};
Object.getOwnPropertyNames(object).forEach(function(value){
typeImages[object[value].type] = object[value].img;
});
arr = arr.map(function(value){
return {
type: value.type,
image: typeImages[value.type]
};
});
Mex
2015-02-14