【问题标题】:Check Array of Objects by Multiple Properties通过多个属性检查对象数组
【发布时间】:2018-06-28 16:05:28
【问题描述】:

我有一个对象数组,我需要检查数组中是否已经存在类似的对象。 例如,是否存在具有相同品牌和型号属性的对象(福特福克斯):

{
  make: 'Ford',
  model: 'Focus',
  color: 'red',
  year: 2016
}

在这个数组中?

[
  {
    make: 'Ford',
    model: 'Focus',
    color: 'blue',
    year: 2008
  },
  {
    make: 'Ford',
    model: 'Mustang',
    color: 'red',
    year: 2011
  },
  {
    make: 'Chevy',
    model: 'Malibu',
    color: 'blue',
    year: 2012
  },
  {
    make: 'Ford',
    model: 'Focus',
    color: 'black',
    year: 1999
  }
]

我更喜欢 ES6 方法,但也可以使用 lodash。 Lodash 有 _.some 但据我所知,它匹配整个对象(不仅仅是所需的特定属性)或仅一个属性。此外,我需要 _.pullAllWith 之类的东西,我可以在其中删除包含这些特定属性的所有对象(即删除所有包含福特福克斯的对象)。

【问题讨论】:

  • 你有任何你已经尝试过的代码可以分享吗?
  • 我正在处理的实际代码比这个例子复杂得多。我已经阅读了各种 Lodash 方法,并且 _.some 和 _.pullAllWith 方法是我能找到的最接近我需要的方法。我也尝试使用 .find 和 .findIndex 但无法正常工作。
  • 如果您的代码有问题,请具体询问,发布您的尝试。只是说 “我需要类似的东西” 并不是一个好问题。
  • @trincot 我强烈反对。与我发布更长、更复杂的示例相比,未来来到这里的任何人都将能够遵循这个示例并更快、更轻松地从中学习。没有必要发布需要更多解释和更多内容供每个人阅读的内容。另外,如果我可以使用其中一个答案并让它与我的代码一起使用,那么这就解决了我的问题。这是发布问题的更好方法。

标签: javascript arrays json object lodash


【解决方案1】:

Javascript 有 some()filter()

var cars = [
  {
    make: 'Ford',
    model: 'Focus',
    color: 'blue',
    year: 2008
  }, {
    make: 'Ford',
    model: 'Mustang',
    color: 'red',
    year: 2011
  }, {
    make: 'Chevy',
    model: 'Malibu',
    color: 'blue',
    year: 2012
  }, {
    make: 'Ford',
    model: 'Focus',
    color: 'black',
    year: 1999
  }
];

使用 some() 可以查看数组中的某些元素是否包含该属性:

const containsFordFocus = cars.some( car =>  car.make === 'Ford' && car.model === 'Focus');
console.log(containsFordFocus); // true

使用过滤器可以排除一些元素:

const filteredArray = cars.filter( car => car.make !== 'Ford' && car.model !== 'Focus');
console.log(filteredArray); // [ { make: 'Chevy', model: 'Malibu', color: 'blue', year: 2012 } ]

【讨论】:

    【解决方案2】:

    创建一个函数并使用someevery,以下适用于您传入的任何键。

    function exists(arr, obj, ...keys) {
        return arr.some(e => keys.every(k => e[k] && obj[k] && e[k] === obj[k]));
    }
    
    console.log(exists(arr, check, 'make', 'model'));
    <script>
    let arr = [
        {
            make: 'Ford',
            model: 'Focus',
            color: 'blue',
            year: 2008
        },
        {
            make: 'Ford',
            model: 'Mustang',
            color: 'red',
            year: 2011
        },
        {
            make: 'Chevy',
            model: 'Malibu',
            color: 'blue',
            year: 2012
        },
        {
            make: 'Ford',
            model: 'Focus',
            color: 'black',
            year: 1999
        }
    ]
    
    let check = {
        make: 'Ford',
        model: 'Focus',
        color: 'red',
        year: 2016
    };
    
    </script>

    【讨论】:

    • 这是动态过滤模式的最佳方法。谢谢!!!!
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多