javascript - 过滤对象数组 - 几个条件

标签 javascript arrays

我有一个对象数组,如下所示:

var data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        }            
    ]

我需要对该数组进行过滤,以删除具有sameid 和相同parentid 的对象。 但这里有一个困扰我的转折...... 如果我得到这个对象数组:

 var data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        },
        {
            name: "grain",
            sameid: 500,
            parentid: 63
        }
    ]

你可以看到名为 grain 的对象(最后一个),它有不同的 parentid。如果是这样,则不应删除任何内容。

我正在为这个而伤脑筋。 我必须考虑的第一个标准是 sameid。我应该把它们分组。然后以某种方式检查父 ID。

数组可以包含很多不同的sameid和parentid

更新: 在第一种情况下,数据具有三个对象。所有的都应该被删除,因为它们都有相同的 sameid 和 parentid。

在第二种情况下,数据有四个对象,所有四个都应该保留,因为有一个不同的对象具有不同的 parentid。

更新期望的结果:

 var filteredObjects = [];
     data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        },
        {
            name: "grain",
            sameid: 500,
            parentid: 63
        }
    ]

在这种情况下,filteredObject 将具有所有值,因为存在一个不同的 parentid:

filteredObjects [{
        name: "block",
        sameid: 500,
        parentid: 62
    },
    {
        name: "circle",
        sameid: 500,
        parentid: 62
    },
    {
        name: "cube",
        sameid: 500,
        parentid: 62
    },
    {
        name: "grain",
        sameid: 500,
        parentid: 63
    }]

在这种情况下:

var filteredObjects = [];
     data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        }            
    ]

filteredObject 将没有值。数据数组也可以包含不同的 sameid。

最佳答案

您可以使用 sameidparentid 构建一棵树。然后过滤项目并仅返回具有两个或更多 parenid 的项目。

function filter(array) {
    var hash = {};
    array.forEach(function (a) {
        hash[a.sameid] = hash[a.sameid] || {};
        hash[a.sameid][a.parentid] = true;
    });
    return array.filter(function (a) {
        return Object.keys(hash[a.sameid]).length > 1;
    });
}

var data0 = [{ name: "block", sameid: 500, parentid: 62 }],
    data1 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }],
    data2 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }, { name: "grain", sameid: 500, parentid: 63 }],
    data3 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }, { name: "grain", sameid: 500, parentid: 63 }, { name: "library", sameid: 600, parentid: 66 }, { name: "wood", sameid: 600, parentid: 66 }, { name: "water", sameid: 700, parentid: 77 }, { name: "fire", sameid: 700, parentid: 78 }, { name: "orphan", sameid: 300, parentid: 12 }];

console.log(filter(data0));
console.log(filter(data1));
console.log(filter(data2));
console.log(filter(data3));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 过滤对象数组 - 几个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39140297/

相关文章:

javascript - 如何使用 GraphQL Yoga 进行多嵌套查询(GET 请求)?

javascript - 这种在 JavaScript 中保存真/假选项的方法有效吗?

ruby-on-rails - Ruby - 如何加速 ".each"数组的循环?

php:将数组与 mysql 结果合并并按数组键对它们进行排序

python numpy 数组追加在 .py 文件中不起作用,但在终端中起作用

javascript - 在 JavaScript 中初始化一个二维数组

javascript - 如何从我自己的 GMail 访问 GMail API?

javascript - 正则表达式:将单词与开头出现的指定字符恰好匹配一次

JavaScript。从随机数组中选取元素

javascript - 使用 jQuery 设置复选框