如何从数组中过滤特定属性并存储到变量中

时间:2017-10-24 09:47:00

标签: javascript arrays data-structures

我有一个数据数组如下:

var arr = [{
    "Sports" : "Hockey",
    "Country" : "AUS",
    "Players" : 11
},{
    "Sports" : "Football",
    "Country" : "Eng",
    "Players" : 11
},{
    "Sports" : "Tennis",
    "Country" : "AUS",
    "Players" : 11
},{
    "Sports" : "Cricket",
    "Country" : "Ind",
    "Players" : 11
},{
    "Sports" : "Gymnastic",
    "Country" : "Russia",
    "Players" : 11
},{
    "Sports" : "Gym",
    "Country" : "AUS",
    "Players" : 11
}];

我想创建一个对象数组,我只想使用上面数组中国家的唯一数据。在这种情况下,我应该得到类似的东西:

var country = [
    { AUS: "" },
    { Eng :"" },
    { Ind : "" },
    { Russia :"" }
];

然后我可以添加我自己的attrbuites,如capital

var country = [{
    AUS: "",
    capital : "Canbara"
}, {
    Eng :"",
    capital : "London"
}, {
    Ind : "",
    capital : "Delhi"
}, {
    Russia :"",
    capital : "Masco"
}];

有人可以帮我解决这个问题吗?

这是我到目前为止所尝试的:

var result = [];
array.forEach(function(e) {
    result.push(this[e.Country]);
}, {});

我被困在这里。

4 个答案:

答案 0 :(得分:3)

您可以使用接受回调提供的功能的map方法。

另外,使用Set ES6 功能以删除重复项

Set对象可让您存储任何类型的unique个值,无论primitive值还是object 引用



var arr = [{ "Sports" : "Hockey", "Country" : "AUS", "Players" : 11 },{ "Sports" : "Football", "Country" : "Eng", "Players" : 11 },{ "Sports" : "Tennis", "Country" : "AUS", "Players" : 11 },{ "Sports" : "Cricket", "Country" : "Ind", "Players" : 11 },{ "Sports" : "Gymnastic", "Country" : "Russia", "Players" : 11 },{ "Sports" : "Gym", "Country" : "AUS", "Players" : 11 }];
arr=[...new Set(arr.map(function(item){
  return item.Country;
}))].map(function(item){
  return {[item]:""};
});
console.log(arr);




另一种解决方案是使用arrow函数。



var arr = [{ "Sports" : "Hockey", "Country" : "AUS", "Players" : 11 },{ "Sports" : "Football", "Country" : "Eng", "Players" : 11 },{ "Sports" : "Tennis", "Country" : "AUS", "Players" : 11 },{ "Sports" : "Cricket", "Country" : "Ind", "Players" : 11 },{ "Sports" : "Gymnastic", "Country" : "Russia", "Players" : 11 },{ "Sports" : "Gym", "Country" : "AUS", "Players" : 11 }];
arr=[...new Set(arr.map(a => a.Country))].map(a=> ({[a] : ""}));
console.log(arr);




答案 1 :(得分:2)

最好使用object而不是array来存储结果(这样可以自动跳过重复项):

const result = {};

array.forEach(o => {
    result[o.Country] = {
        [o.Country]: '',
        capital: '',
    };
});

这将返回如下内容:

{
    AUS: {AUS: "", capital: ""},
    Eng: {Eng: "", capital: ""},
    Ind: {Ind: "", capital: ""},
    Russia: {Russia: "", capital: ""}
}

这取决于您真正想要如何使用结果。

答案 2 :(得分:2)

您可以使用Set删除重复项,然后再使用map()来删除对象。

var arr = [{"Sports":"Hockey","Country":"AUS","Players":11},{"Sports":"Football","Country":"Eng","Players":11},{"Sports":"Tennis","Country":"AUS","Players":11},{"Sports":"Cricket","Country":"Ind","Players":11},{"Sports":"Gymnastic","Country":"Russia","Players":11},{"Sports":"Gym","Country":"AUS","Players":11}]

var r = [...new Set(arr.map(({Country}) => Country))].map(e => ({[e]: ''}))
console.log(r)

答案 3 :(得分:2)

你可以做到

var arr = [{
    "Sports" : "Hockey",
    "Country" : "AUS",
    "Players" : 11
},{
    "Sports" : "Football",
    "Country" : "Eng",
    "Players" : 11
},{
    "Sports" : "Tennis",
    "Country" : "AUS",
    "Players" : 11
},{
    "Sports" : "Cricket",
    "Country" : "Ind",
    "Players" : 11
},{
    "Sports" : "Gymnastic",
    "Country" : "Russia",
    "Players" : 11
},{
    "Sports" : "Gym",
    "Country" : "AUS",
    "Players" : 11
}];

let result = arr.map(e => e.Country);
result = result.filter((e, i) => result.indexOf(e) == i).reduce((a, b) => {
    let obj = {};
    obj[b] = "";
    a.push(obj);
    return a;
}, []);;
console.log(result);