繁体   English   中英

从对象数组中获取唯一值

[英]Get unique values from an array of objects

[
  {key1 : 'sometext'},
  {key2 : 'sometext'},
  {key1 : 'sometext'},
  {key3 : 'sometext'},
]

从上面的代码我需要得到如下结果,删除包含相同键的对象

[
  {key1 : 'sometext'},
  {key2 : 'sometext'},
  {key3 : 'sometext'},
]

提前致谢。

使用 lodash,您可以使用_.uniqBy() ,并返回每个对象的单个键:

 const arr = [{"key1":"sometext"},{"key2":"sometext"},{"key1":"sometext"},{"key3":"sometext"}] const result = _.uniqBy(arr, o => _.keys(o)[0]) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

使用 vanilla JS,如果您不关心第二个项目(将使用重复项,您可以将所有项目合并为一个对象(这将删除第一个重复项),获取条目,然后映射回数组对象:

 const arr = [{"key1":"sometext"},{"key2":"sometext"},{"key1":"sometext"},{"key3":"sometext"}] const result = Object.entries(Object.assign({}, ...arr)) .map(([k, v]) => ({ [k]: v })) console.log(result)

_.uniqBy(data, _.findKey);

解释:

_.uniqueBy()您需要告诉您要导出唯一性的值,或者您将字符串作为属性传递(该属性的值将用于确定唯一性),或者您传递一个将返回的回调一个值,该值将被视为评估唯一性。 如果我们将确定唯一性的值是一个普通的本地值, _.uniqueBy()是更好的选择,因此您无需手动比较(如果您的值是复杂对象,则必须这样做)并在许多键上确定唯一性)。 在我们的例子中,它是简单的object key ,它可以是stringsymbol ,所以,我们可以使用_uniqueBy来让lodash_uniqueBy

在我们的例子中,如果我们可以返回每个对象的唯一键(它必须正好是 1,否则任何逻辑都不起作用), _.uniqueBy()可以做的更远,所以基本上我们的目标是传递一个回调将返回唯一的键。 我们可以简单地传递一个回调来评估它: e => _.keys(e)[0]

现在, _.findkey将 object 作为第一个参数和返回值的真实性,如果它是真实的,那么它将返回该键(与返回_.find实体_.find ),因此如果您不传递回调,一个默认的回调值a => a被自动分配来处理这种情况。 这意味着它将检查每个实体的真实性(在这种情况下是键),显然,键必须是一个真实值,因此它将返回第一个实体本身(这里是_.findKey第一个键),因此传递一个回调包装 findKey 只有一个参数,如a => _.findKey(a)相当于传递_.findKey回调,我们可以让它更简单, _.uniqueBy(data, _.findKey)将完成这项工作。

让我们有一个片段:

 let data=[{key1:"sometext"},{key2:"sometext"},{key1:"sometext"},{key3:"sometext"}]; let res = _.uniqBy(data, _.findKey); console.log('Unique Result: ', res);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

这是使用纯 javascript,而不是使用 loadash

 const arr = [ {key1 : 'sometext'}, {key2 : 'sometext'}, {key1 : 'sometext'}, {key3 : 'sometext'}, ]; const result = arr.reduce((acc, item) => { if (!acc.find(x => Object.keys(x).sort().toString() == Object.keys(item).sort().toString() )) { acc.push(item) } return acc; }, []); console.log(result);

简单快速的解决方案。 没有太多的迭代。

 const data = [ { key1: "sometext" }, { key2: "sometext" }, { key1: "sometext" }, { key3: "sometext" } ]; const uniqueElementsBy = (arr, fn) => arr.reduce((acc, v) => { if (!acc.some(x => fn(v, x))) acc.push(v); return acc; }, []); const isEqual = (x, y) => JSON.stringify(x) == JSON.stringify(y); console.log(uniqueElementsBy(data, isEqual)); // For complex solution const isEqual2 = (x, y) => { const keys1 = Object.keys(x); const keys2 = Object.keys(y); if (keys1.length != keys2.length) return false; return !keys1.some(key => x[key] != y[key]); }; console.log(uniqueElementsBy(data, isEqual2)); const data2 = [ { key2: "sometext", key1: "sometext" }, { key2: "sometext" }, { key1: "sometext", key2: "sometext" }, { key3: "sometext" } ]; console.log(uniqueElementsBy(data2, isEqual2)); const data3 = [ { key1: "sometext" }, { key2: "sometext" }, { key1: "sometext", key2: "sometext" }, { key3: "sometext" } ]; console.log(uniqueElementsBy(data3, isEqual2));
 .as-console-row {color: blue!important}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM