下划线.js根据值重新构造对象
Underscore.js re-structure an object based on values
我正在使用下划线.js,当然任何解决方案都可以,但我有一个看起来像这样的对象:
{ '4f871d4967e04':
[ { _id: 4f871d4adaf6fa492f000001,
product_id: 4f871d43daf6fa4e2f000002,
width: '300',
height: 300,
group: '4f871d4967e04' },
{ _id: 4f871d4adaf6fa492f000004,
product_id: 4f871d43daf6fa4e2f000002,
width: '150',
height: 150,
group: '4f871d4967e04' },
{ _id: 4f871d4bdaf6fa492f000007,
product_id: 4f871d43daf6fa4e2f000002,
width: '100',
height: 100,
group: '4f871d4967e04' },
{ _id: 4f871d4bdaf6fa492f00000a,
product_id: 4f871d43daf6fa4e2f000002,
width: '75',
height: 75,
group: '4f871d4967e04' } ],
'4f871d51200de':
[ { _id: 4f871d51daf6faf42e000001,
product_id: 4f871d43daf6fa4e2f000002,
width: '300',
height: 300,
group: '4f871d51200de' },
{ _id: 4f871d52daf6faf42e000004,
product_id: 4f871d43daf6fa4e2f000002,
width: '150',
height: 150,
group: '4f871d51200de' },
{ _id: 4f871d53daf6faf42e000007,
product_id: 4f871d43daf6fa4e2f000002,
width: '100',
height: 100,
group: '4f871d51200de' },
{ _id: 4f871d53daf6faf42e00000a,
product_id: 4f871d43daf6fa4e2f000002,
width: '75',
height: 75,
group: '4f871d51200de' } ] }
我想把它变成这个:
{"4f871d4967e04" : {
"300" : {
_id : '',
}
"150" : {
_id : '',
}
"100" : {
_id : '',
}
"75" : {
_id : '',
}
}, "4f871d4967e04" : {
"300" : {
_id : '',
}
"150" : {
_id : '',
}
"100" : {
_id : '',
}
"75" : {
_id : '',
}
}
这样,我可以遍历每个"组",只需使用this["300"]
即可获得所需的大小。 我正在 Handlebar 的模板中迭代它,所以我仅限于我可以检查的条件。
任何建议都会很有帮助。
谢谢!
显而易见的 plain-jane JavaScript 方法可能是最快的:
var want = { };
var k, i, o;
for(k in data) {
want[k] = { };
for(i = 0; i < data[k].length; ++i) {
o = data[k][i];
want[k][o.width] = o;
}
}
只需逐个键遍历主对象(data
),并使用内部循环将数组重新排列为宽度→对象映射表。
你想出的任何东西都可能是伪装的嵌套循环。下划线版本如下所示:
var want = _(data).reduce(function(outer, v, k) {
outer[k] = _(v).reduce(function(inner, o) {
inner[o.width] = o;
return inner;
}, { });
return outer;
}, { });
这几乎是原始的嵌套for
循环,用reduce
代替循环。您在这里几乎只能使用reduce
因为大多数 Underscore 函数确实希望将所有内容转换为数组。您可以使用each
:
var want = { };
_(data).each(function(v, k) {
var inner = { };
_(v).each(function(o) {
inner[o.width] = o;
});
want[k] = inner;
});
但这与使用临时变量的reduce
方法相同。您可能会想出其他方法,但它们可能只是这个主题的更多变体。
演示:http://jsfiddle.net/ambiguous/ffcUC/2/
如果要将数据发送到 Handlebars 模板,例如:
{{#each images}}<img src="../{{this.300._id}}" />{{/each}}
然后,您只需要上述生成的值。但在这种情况下,您可以调整循环以节省一些工作:
var want = [ ];
var k, i, o;
for(k in data) {
o = { };
for(i = 0; i < data[k].length; ++i) {
o[data[k][i].width] = data[k][i];
}
want.push(o);
}
return want;
或切换到map
内的reduce
:
var index_by_height = function(o) {
return _(o).reduce(function(memo, i) {
memo[i.height] = i;
return memo;
}, { });
};
return _.chain(data)
.values()
.map(index_by_height)
.value();
演示:http://jsfiddle.net/ambiguous/tsx7z/
相关文章:
- 如何使用内部对象构造对象
- javascript处理一个对象数组以获得一个新的对象数组
- “new”关键字是在构造对象时自动设置“constructor”属性的唯一方法吗
- 返回带有筛选结果的新JSON对象
- JavaScript - 构造对象的不同方法
- 新Javascript对象的可选初始化属性
- Kinetic.js旋转组对象的新子对象具有不正确的偏移
- 嵌入多对多关系-如果一个新对象还不存在,则添加一个新的对象
- 使用递归构造对象
- 传递 JavaScript 函数以在新窗口对象中运行
- 单击新 DOM 对象时的操作
- 使用 JavaScript 比较 2 个数组并创建一个新的对象数组,该数组不包含与 id 字段匹配的对象
- 如何在 Crockford 的新构造函数模式中共享“构造函数”功能
- 使用对象方法实例化新的对象 JavaScript
- 下划线.js根据值重新构造对象
- 如何在javascript中构造对象
- 如何在使用 outerHTML 更改内容后获取对新 DOM 对象的引用
- 如何在 Javascript 中访问数组中构造对象的属性
- 对象getter/setter与新构造函数的比较-测试结果
- 用新函数()构造对象{}与用(function(){}()调用函数相比-性能