【问题标题】:Filter a number of javascript objects using an array of values for one key使用一个键的值数组过滤多个 javascript 对象
【发布时间】:2015-04-19 23:39:15
【问题描述】:

我想使用以下 category_id 值数组按 category_id 过滤以下对象:

[19012000, 19012001, 19012002, 19012003, 19012004, 19012005, 19012006, 19012007, 19012008] 



Object {_account: "mjj9jp92z2fD1mLlpQYZI1gAd4q4LwTKmBNLz", _id: "rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61", amount: 15, category: Array[2], category_id: "13005015"…}
Object {_account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj", _id: "944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB", amount: 50, category: Array[3], category_id: "19012000"…}
Object {_account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj", _id: "rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK", amount: 24, category: Array[2], category_id: "13005007"…}
Object {_account: "mjj9jp92z2fD1mLlpQYZI1gAd4q4LwTKmBNLz", _id: "rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61", amount: 45, category: Array[2], category_id: "13005009"…}
Object {_account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj", _id: "944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB", amount: 105, category: Array[3], category_id: "13005009"…}

完成后,category_id 为 19012000 的对象应该是唯一剩下的了。

Object {_account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj", _id: "944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB", amount: 50, category: Array[3], category_id: "19012000"…}

我对不同版本的 iteratee 函数进行了多次尝试,包括 filter、map 和 each,并尝试了使用键、值、反转、选择和省略的键值过滤器。在尝试了这个之后,我认为应该可以,我与您联系:

var postDate = _.filter(_.first(goodDates), function(n){return category_id.indexOf(n.category_id) !== -1})

其中 goodDates 是对象列表,category_id 是上面的数组。

【问题讨论】:

    标签: javascript arrays object functional-programming underscore.js


    【解决方案1】:

    indexOf() 带有一个字符串和一个数字

    var a = [123]; 
    console.log(a.indexOf(123));  //true   
    console.log(a.indexOf("123"));  //false
    

    您的代码不起作用,因为您将对象中的字符串与数组中的数字进行比较。

    category_id.indexOf(+n.category_id)
    

    category_id.indexOf(parseInt(n.category_id, 10))
    

    【讨论】:

    • 哇!我从来没有见过。它必须是问题的一部分。尽管如此,我还是把你的代码粘贴了给我: .filter(.first(goodDates), function(n){return category_id.indexOf(+n.category_id) !== -1}) 只是为了彻底,我还尝试了 .filter(.first(goodDates), function(n){return category_id.indexOf(+n.category_id)}) .filter(. first(goodDates), function(n){return category_id.indexOf(parseInt(n.category_id, 10))) !== -1}) .filter(.first(goodDates), function( n){return category_id.indexOf(parseInt(n.category_id, 10))}) 我仍然只收到一个空数组列表 []
    • 谢谢一百万。我最终使用 for 循环和 if 语句恢复到以前的版本。感谢您梳理出我这次能够成功的细节!
    【解决方案2】:

    我看不出有什么理由在这里使用_.first?过滤器语句的其余部分看起来不错,尽管您可以将 indexOf 调用替换为 _.contains

    var postDates = _.filter(goodDates, function(n){
        return _.contains(category_id, n.category_id);
    });
    

    【讨论】:

    • _.first 是因为每个对象都包装在来自先前查询的数组中。 _.first(goodDates) 是上面显示的对象。我现在就试试你的建议。
    • 返回一些空数组 [] 我使用的是下划线 1.7。我认为它必须是活动的,因为 _.find、_.map、_.extend、_.groupBy 在整个 JS 文件中的不同位置。
    • 呃,在您的 OP 中,您没有说任何关于包裹在数组中的对象,您只是说“goodDates 是对象列表”。实际上将 goodDates 发布为 JSON 将有助于清除这一点。
    • 没关系,这部分我已经控制好了。 _.first(goodDates) 是您在上面看到的对象;我通过循环将先例运行到 goodDates 并将结果推送到数组中,因此我使用 _.first 将每个循环结果从数组中取出。我只关心过滤对象以取出所有对象,除了数组中有 category_id 的对象。 epascarello 敏锐地指出,其中一个问题是对象中的 category_id 是文本,数组中是数字。
    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多