Object.entries()将键转换为数组

时间:2020-06-17 19:42:45

标签: javascript arrays

我要引入一个对象,当我执行console.log()时,该对象将以以下格式返回数据:

{PerformanceYear:
  [{2020: "2020", checked: false}
   {2019: "2019", checked: true}
   {2018: "2018", checked: false}
   {2017: "2017", checked: false}
  ],
 Region: 
  [{1: "WA", checked: true}
   {2: "OR", checked: false}
   {3: "MT", checked: false}
   {4: "Other", checked: false}
  ],
 Service Area:
  [{5: "Northwest", checked: false}
   {6: "Southwest", checked: true}
   {7: "Southeast", checked: true}
   {8: "Other", checked: false}
  ],
}

(因此整个数据集是一个对象,而不是数组)

我正在尝试过滤,但这只能在数组上完成,因此我使用Object.entries()将其转换为数组。唯一的问题是,PerformanceYear,Region和Service Area中的每个也都变成了自己的单独数组,因此当我尝试这样做时:

var filtered = [];
for (var i = 0; i < entries.length; i++) {
    for (var x = 0; x < entries[i][1].length; x++)
        if (entries[i][1][x].checked === true) {
            filtered.push(entries[i][1][x]);
        }
}
console.log(filtered)

我明白了:

[{2019: "2019", checked: true},
 {1: "WA", checked: true},
 {6: "Southwest", checked: true},
 {7: "Southeast", checked: true}
]

想要得到的是这样的:

[PerformanceYear: {2019: "2019", checked: true},
Region: {1: "WA", checked: true},
Service Area: {6: "Southwest", checked: true}, {7: "Southeast", checked: 
true}
]

如果我尝试了filtered.push(entries [i] [1]),它不会过滤掉选中的===假值。有没有一种方法可以过滤原始对象而不将其变成数组?还是有一种方法可以在不使用array.entries()的情况下将原始对象变成数组?我已经为此工作了两天,但似乎并没有取得太大进展。 TIA!

1 个答案:

答案 0 :(得分:1)

假设您想保留外键,则可以获取条目并过滤数组。

var data = { PerformanceYear: [{ 2020: "2020", checked: false }, { 2019: "2019", checked: true }, { 2018: "2018", checked: false }, { 2017: "2017", checked: false }], Region: [{ 1: "WA", checked: true }, { 2: "OR", checked: false }, { 3: "MT", checked: false }, { 4: "Other", checked: false }], ServiceArea: [{ 5: "Northwest", checked: false }, { 6: "Southwest", checked: true }, { 7: "Southeast", checked: true }, { 8: "Other", checked: false }] },
    result = Object.fromEntries(Object
        .entries(data)
        .map(([k, a]) => [k, a.filter(({ checked }) => checked)])
    );

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