![](/img/trans.png)
[英]filter nested array of objects based on object values Javascript ES6
[英]Javascript/ES6 generate nested array from 1 level object
我确实有一个来自API的对象,如下所示:
this.Variations = [
{
attributes: [
{name: "Cor", option: "Preto"},
{name: "Tamanho", option: "P"},
{name: "Tecido", option: "Algodao"},
],
id : 1
},
{
attributes: [
{name: "Cor", option: "Preto"},
{name: "Tamanho", option: "P"},
{name: "Tecido", option: "Elastano"},
],
id : 2
},
{
attributes: [
{name: "Cor", option: "Preto"},
{name: "Tamanho", option: "M"},
{name: "Tecido", option: "Algodao"},
],
id : 3
}, ...
我必须从中生成一个嵌套数组,以便创建我需要的体验,即用户按时间选择一个属性并加载可能的选项。
我为此苦苦思索很久了,却一无所获。
我相信我需要一个类似的数组:
array['Preto']['P']['Algodao'] = info;
array['Preto']['P']['Elastano'] = info;
array['Preto']['M']['Algodao'] = info;
有关如何操作的任何提示?
假设info
您的id
值,请尝试这种方法
var output = variations.map( s => ({ [s.attributes[0].option ] :
{ [s.attributes[1].option ] :
{ [ s.attributes[2].option] : s.id } } }) );
演示版
var variations = [{ attributes: [{ name: "Cor", option: "Preto" }, { name: "Tamanho", option: "P" }, { name: "Tecido", option: "Algodao" }, ], id: 1 }, { attributes: [{ name: "Cor", option: "Preto" }, { name: "Tamanho", option: "P" }, { name: "Tecido", option: "Elastano" }, ], id: 2 }, { attributes: [{ name: "Cor", option: "Preto" }, { name: "Tamanho", option: "M" }, { name: "Tecido", option: "Algodao" }, ], id: 3 } ]; var output = variations.map( s => ({ [s.attributes[0].option ] : { [s.attributes[1].option ] : { [ s.attributes[2].option] : s.id } } }) ); console.log( output );
您可以迭代数组和嵌套对象的属性,并在叶子处分配一个值。
var data = [{ attributes: [{ name: "Cor", option: "Preto" }, { name: "Tamanho", option: "P" }, { name: "Tecido", option: "Algodao" }], id: 1 }, { attributes: [{ name: "Cor", option: "Preto" }, { name: "Tamanho", option: "P" }, { name: "Tecido", option: "Elastano" }], id: 2 }, { attributes: [{ name: "Cor", option: "Preto" }, { name: "Tamanho", option: "M" }, { name: "Tecido", option: "Algodao" }], id: 3 }], result = {}; data.forEach(function (a) { a.attributes.reduce(function (r, b, i, bb) { return r[b.option] = i + 1 === bb.length ? a.id : r[b.option] || {}; }, result); }); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
不管attributes
数组中的项目数量如何,此代码均有效:
var Variations = [ { attributes: [ {name: "Cor", option: "Preto"}, {name: "Tamanho", option: "P"}, {name: "Tecido", option: "Algodao"}, {name: "Foo", option: "Bar"}, ], id : 1 }, { attributes: [ {name: "Cor", option: "Preto"}, {name: "Tamanho", option: "P"}, {name: "Tecido", option: "Elastano"}, ], id : 2 }, { attributes: [ {name: "Cor", option: "Preto"}, {name: "Tamanho", option: "M"}, {name: "Tecido", option: "Algodao"}, ], id : 3 }]; const getLevelValue = (rec, att, index) => index === rec.attributes.length - 1 ? rec.id : {}, getData = variations => variations.map(rec => rec.attributes. reduce(({acc, current}, att, index) => (current = current ? current[att.option] = getLevelValue(rec, att, index) : acc[att.option] = getLevelValue(rec, att, index), {acc, current}), {acc: {}}).acc); console.log(getData(Variations));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.