Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 转换并过滤动态JSON返回对象_Javascript_Arrays_Json_Ecmascript 6 - Fatal编程技术网

Javascript 转换并过滤动态JSON返回对象

Javascript 转换并过滤动态JSON返回对象,javascript,arrays,json,ecmascript-6,Javascript,Arrays,Json,Ecmascript 6,我不知道如何做到这一点 我有一个返回的JSON对象: [ { first_dynamic_property: 'something', second_dynamic_property: 'something else' }, { first_dynamic_property: 'something 2', second_dynamic_property: 'something else 2' }, { first_dynamic_property: 'something

我不知道如何做到这一点

我有一个返回的JSON对象:

[
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
    { first_dynamic_property: 'something 2', second_dynamic_property: 'something else 2' },
    { first_dynamic_property: 'something 3', second_dynamic_property: 'null' },
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
]
我想将这个对象转换成一个新对象,如:

[
    { first_dynamic_property: 'something' },
    { first_dynamic_property: 'something 2' },
    { first_dynamic_property: 'something 3' },
    { second_dynamic_property: 'something else' }
]
如果您查看,该对象会过滤重复的项目,并将两个项目转换为一个项目对象。我不记得如何做到这一点。你知道最好的方法吗

谢谢和问候

编辑1:


我使用了第一个\u dynamic\u属性第二个\u dynamic\u属性,因为我不知道键名或键名的数量。它们是动态生成的。

您可以使用一个对象来存储预先存在的键,然后使用一个简单的映射函数来迭代这些键并返回新数组

let existingKeys = {};

const input = [
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
    { first_dynamic_property: 'something 2', second_dynamic_property: 'something else 2' },
    { first_dynamic_property: 'something 3', second_dynamic_property: 'null' },
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
];

let output = input.map(elem => {
    const {first_dynamic_property, second_dynamic_property} = elem;
    if(!(first_dynamic_property in existingKeys)){
        existingKeys[first_dynamic_property] = true;
        return {first_dynamic_property};
    } else if(!(second_dynamic_property in existingKeys)){
        existingKeys[second_dynamic_property] = true;
        return {second_dynamic_property};
    }
});

根据新要求更新:

let dataList = [
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
    { first_dynamic_property: 'something 2', second_dynamic_property: 'something else 2' },
    { first_dynamic_property: 'something 3', second_dynamic_property: 'null' },
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
]
let values = new Set();

let result = dataList.map(data => {
    let newData = {};
    for (let key in data) {
        let value = data[key];
        if (values.has(value)) continue;
        values.add(value);
        newData[key] = value;
        break;
    }
    return newData;
})

console.info(result)

以下是转换任何对象列表的通用代码:

const data = [
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
    { first_dynamic_property: 'something 2', second_dynamic_property: 'something else 2' },
    { first_dynamic_property: 'something 3', second_dynamic_property: 'null' },
    { first_dynamic_property: 'something', second_dynamic_property: 'something else' },
];
const result = data.reduce((acc, item) => {
        return [...acc, ...Object.keys(item).map((key) => { return {[key]: item[key]} })];
  }, []
);
console.log(result[0]);
希望这有帮助:)

更新:如果只需要显示唯一的元素,可以添加计数器映射和筛选数据。Smth是这样的:

const values_counter = {};
const result = data.reduce((acc, item) => {
        return [...acc, ...Object.keys(item).map(key => { 
        values_counter[item[key]] = values_counter[item[key]] + 1 || 1;
      return {[key]: item[key]} })
    ];
  }, []
).filter(item => values_counter[item[Object.keys(item)[0]]] === 1);