Angular 8:从数组中删除空对象

3

我正在使用Angular8,想要从数组中删除空对象,并获取其长度。

Array: [
{data01: "abc", data02: "cde", data03: "fgh", data04: "", data05: ""},
{data01: "abc", data02: "cde", data03: "", data04: "", data05: ""},
{data01: "abc", data02: "cde", data03: "fgh", data04: "ijk", data05: "lmn"},
{data01: "abc", data02: "", data03: "", data04: "", data05: ""},
]

然后我希望它变成这样

Array: [
{data01: "abc", data02: "cde", data03: "fgh"},
{data01: "abc", data02: "cde"},
{data01: "abc", data02: "cde", data03: "fgh", data04: "ijk", data05: "lmn"},
{data01: "abc"},
]

有没有什么方法可以实现?

我尝试将这些元素推到一个新数组中,如下所示:

_Array: ["abc","cde", "fgh", "", "", ....] 

尝试将其分为5个块, 然后使用filter(Boolean)进行过滤,虽然有效,但性能有点慢,是否有其他方法可以改善性能?


这个怎么样?https://dev59.com/JnVC5IYBdhLWcg3wdw65#286162 - Sameer
你能否在问题中包含你现有的代码? - Rohit Mishra
2
arr.map(i => Object.entries(i).filter(([k,v]) => v).reduce((acc,[k,v]) => ({...acc, [k]: v}), {})) - Amir Popovich
你的代码很好,但我想要获取长度,但是你的代码似乎无法实现。 - Lynn
2个回答

2
你可以使用JS中的Array对象方法map()和filter()来解决问题。

let array = [
{data01: "abc", data02: "cde", data03: "fgh", data04: "", data05: ""},
{data01: "abc", data02: "cde", data03: "", data04: "", data05: ""},
{data01: "abc", data02: "cde", data03: "fgh", data04: "ijk", data05: "lmn"},
{data01: "abc", data02: "", data03: "", data04: "", data05: ""},
]; // array provided

array = array.map(object => {
          let entries = Object.entries(object); //for each element in the array get the entries, [key, value] pair
          entries = entries.filter(([key, value]) => value !== ""); // remove the elements which has "" values
          return Object.fromEntries(entries);
          });
console.log(array.length);
// shorter version
array = array.map(object => Object.fromEntries(Object.entries(object).filter(([key, value]) => value !== "")));
console.log(array.length);

如果输入数组中有一个对象,该对象的所有条目都是""(空字符串),则有可能导致结果数组包含一个空对象。例如:{data01: "", data02: "", data03: "", data04: "", data05: ""}。在这种情况下,我们需要使用另一个filter()来从结果数组中删除空对象。

let array = [
    {data01: "abc", data02: "cde", data03: "fgh", data04: "", data05: ""},
    {data01: "abc", data02: "cde", data03: "", data04: "", data05: ""},
    {data01: "abc", data02: "cde", data03: "fgh", data04: "ijk", data05: "lmn"},
    {data01: "abc", data02: "", data03: "", data04: "", data05: ""},
    ]; // array provided

    array = array.map(object => {
              let entries = Object.entries(object);
              entries = entries.filter(([key, value]) => value !== "");
              return Object.fromEntries(entries);
              });
    // remove the empty object if present
    array = array.filter(object => Object.entries(object).length !== 0);
    console.log(array.length);
    // shorter version
    array = array.map(object => Object.fromEntries(Object.entries(object).filter(([key, value]) => value !== ""))).filter(object => Object.entries(object).length !== 0);
    // the filter() at the  end removes the empty object
    console.log(array.length);


这正是我所期望的!但如果能将新数组推入[key]: value中会更好。 - Lynn

1

您可以使用纯JavaScript实现此操作。请尝试以下代码。

var arr = [
{data01: "abc", data02: "cde", data03: "fgh", data04: "", data05: ""},
{data01: "abc", data02: "cde", data03: "", data04: "", data05: ""},
{data01: "abc", data02: "cde", data03: "fgh", data04: "ijk", data05: "lmn"},
{data01: "abc", data02: "", data03: "", data04: "", data05: ""},
]

arr.forEach(function(element){
for (var key in element) {
    if (element[key] === "") {
        delete element[key]
    }
}
});

console.log(arr)


这段代码很好,但我试图获取长度,但似乎无法实现。 - Lynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接