我有一个像这样的动态对象数组:
var arr = [
{state: "FL"},
{state: "NY"},
{state: "FL"},
{gender: "Male"},
{state: "NY"},
{gender: "Female"},
{gender: "Female"},
{year: "1990"}
]
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得独特的物体?
所需的输出是一个只包含唯一对象的数组:
arr = [
{state: "FL"},
{state: "NY"},
{gender: "Male"},
{gender: "Female"},
{year: "1990"}
]
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用reduce这样的东西,但在这种方式我需要知道对象键:
arr = arr.reduce((acc, curr) =>
acc.find(e => e['state'] === curr['state']) ? acc : [...acc, curr], [])
Run Code Online (Sandbox Code Playgroud)
这不是重复,因为其他问题不使用"动态对象"来获得独特性
您可以对所有对象进行字符串化,获取唯一的JSON并将字符串转换回对象.
var array = [{ state: "FL" }, { state: "NY" }, { state: "FL" }, { gender: "Male" }, { state: "NY" }, { gender: "Female" }, { gender: "Female" }, { year: "1990" }],
unique = Array.from(
new Set(array.map(o => JSON.stringify(o))),
s => JSON.parse(s)
);
console.log(unique);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)
如果对象中有多个键,并且因为如果对象的键不同,我建议首先获取条目,对此数组进行排序,将其字符串化为一组并返回新对象.
var array = [{ foo: 42, state: "FL" }, { state: "FL", foo: 42 }, { state: "FL" }, { state: "NY" }, { state: "FL" }, { gender: "Male" }, { state: "NY" }, { gender: "Female" }, { gender: "Female" }, { year: "1990" }],
unique = Array.from(
new Set(array.map(o => JSON.stringify(Object.entries(o).sort(([a], [b]) => a.localeCompare(b))))),
s => Object.assign({}, ...JSON.parse(s).map(([k, v]) => ({ [k]: v })))
);
console.log(unique);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)