【问题标题】:Remove items from one array of objects from another array of objects with _.differenceBy使用 _.differenceBy 从另一个对象数组中删除一个对象数组中的项目
【发布时间】:2016-11-28 05:26:04
【问题描述】:

我有两个对象数组:

var defendantList = [
  {
    label: "Joe BLow"
    value: "Joe Blow"
  },
  {
    label: "Sam Snead"
    value: "Sam Snead"
  },
  {
    label: "John Smith"
    value: "John Smith"
  },
];

var dismissedDefendants = [
  {
    date: 'someDateString',
    value: "Joe Blow"
  },
  {
    date: "someOtherDateString",
    value: "Sam Snead"
  }
];

我需要创建一个数组,其中包含来自被告列表的值,这些值不包含在驳回的被告中。我怎样才能简单地做到这一点,无论是使用 lodash 还是标准的 JS 数组函数?我正在查看 lodash 的 _.differenceBy,因为它有一个迭代器,但我不太清楚如何。

更新:本例中所需的最终结果只是一个包含不匹配对象的数组:

  var newArray = [
      {
        label: "John Smith"
        value: "John Smith"
      },
    ];

谢谢。

【问题讨论】:

  • @HenryDev 不,因为我知道在这种情况下标签和值是相同的。

标签: javascript arrays lodash


【解决方案1】:

使用_.differenceBy()

_.differenceBy(defendantList, dismissedDefendants, 'value');

var defendantList = [
  {
    label: "Joe BLow",
    value: "Joe Blow"
  },
  {
    label: "Sam Snead",
    value: "Sam Snead"
  },
  {
    label: "John Smith",
    value: "John Smith"
  },
];

var dismissedDefendants = [
  {
    date: 'someDateString',
    value: "Joe Blow"
  },
  {
    date: "someOtherDateString",
    value: "Sam Snead"
  }
];

var result = _.differenceBy(defendantList, dismissedDefendants, 'value');

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

还有一个基于Array.prototype.filter()Set的ES6解决方案:

defendantList.filter(function({ value }) { 
  return !this.has(value); // keep if value is not in the Set
}, new Set(dismissedDefendants.map(({ value }) => value))); //create a Set of unique values in dismissedDefendants and assign it to this

var defendantList = [
  {
    label: "Joe BLow",
    value: "Joe Blow"
  },
  {
    label: "Sam Snead",
    value: "Sam Snead"
  },
  {
    label: "John Smith",
    value: "John Smith"
  },
];

var dismissedDefendants = [
  {
    date: 'someDateString',
    value: "Joe Blow"
  },
  {
    date: "someOtherDateString",
    value: "Sam Snead"
  }
];

var result = defendantList.filter(function({ value }) { 
  return !this.has(value); 
}, new Set(dismissedDefendants.map(({ value }) => value)));

console.log(result);

【讨论】:

    【解决方案2】:

    这是一个使用纯 Javascript 的简单解决方案。希望对您有所帮助!

    var defendantList = [
      {
        label: "Joe BLow",
        value: "Joe Blow"
      },
      {
        label: "Sam Snead",
        value: "Sam Snead"
      },
      {
        label: "John Smith",
        value: "John Smith"
      },
    ];
    
    var dismissedDefendants = [
      {
        date: 'someDateString',
        value: "Joe Blow"
      },
      {
        date: "someOtherDateString",
        value: "Sam Snead"
      }
    ];
    
    for(var i in defendantList){
        for(var j in dismissedDefendants){
          if(defendantList[i].value === dismissedDefendants[j].value){
            var index = defendantList.indexOf(defendantList[i]);
            if (index > -1) {
            defendantList.splice(index, 1);
            }
          }
        }
    }
    console.log(defendantList);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2019-11-23
      • 2016-11-08
      相关资源
      最近更新 更多