从特定的 JSON 键值对创建数组



假设我有一个这样的JSON数组

[{"name":"Lenovo Thinkpad 41A4298","website":"google"},
{"name":"Lenovo Thinkpad 41A2222","website":"google"},
{"name":"Lenovo Thinkpad 41Awww33","website":"yahoo"},
{"name":"Lenovo Thinkpad 41A424448","website":"google"},
{"name":"Lenovo Thinkpad 41A429rr8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ff8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ss8","website":"rediff"},
{"name":"Lenovo Thinkpad 41A429sg8","website":"yahoo"}]

我想获取website值等于google的所有name的数组。

首先,要过滤 JSON 数组以仅包含googlewebsite的条目,我有这个:

var data_filter = data.filter( element => element.website =="google");
console.log(data_filter);

给出以下结果:

[{"name":"Lenovo Thinkpad 41A4298","website":"google"},
{"name":"Lenovo Thinkpad 41A2222","website":"google"},
{"name":"Lenovo Thinkpad 41A424448","website":"google"}]

接下来我需要做什么才能将name放在单独的数组中。我尝试这样做:

let new_array = [];
new_array.push(data_filter.body.name)

这给了我一个未定义的错误name.我也试过:

new_array.push(data_filter.name)
new_array.push(data_filter.body[0].name)

但是这些方法都不起作用。我在这里错过了什么?

仅供参考 - JSON数据和过滤器方法在这篇SO帖子中提到 - 归功于OP和答案。

您需要使用双等号来比较==而不是单=。当它是单个时,您将element.website更改(分配(为"google"。该表达式的结果是您设置的值,该值"google"并且它是一个真值,因此所有元素都通过了filter()的测试。

var data = [{"name":"Lenovo Thinkpad 41A4298","website":"google"},
{"name":"Lenovo Thinkpad 41A2222","website":"google"},
{"name":"Lenovo Thinkpad 41Awww33","website":"yahoo"},
{"name":"Lenovo Thinkpad 41A424448","website":"google"},
{"name":"Lenovo Thinkpad 41A429rr8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ff8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ss8","website":"rediff"},
{"name":"Lenovo Thinkpad 41A429sg8","website":"yahoo"}];
var data_filter = data.filter( element => element.website == "google");
var names = data_filter.map(function (elem) {
return elem.name;
});
console.log(names);

若要在筛选结果后获取名称,请使用map()

您的代码不起作用,因为您尝试访问筛选结果的属性body。筛选的结果由原始结果数组组成,但仅包含通过测试的条目。由于原始条目没有body属性,因此筛选的结果也不会具有该属性。而且,您尝试了永远不会存在的data_filter.bodydata_filter因为它将始终是数组并且数组没有body属性。

在此处阅读有关filter()的更多信息。

filter后使用map(也使用===更正=(

var data_filter = data.filter( element => element.website === "google").map( s => s.name );

或者,如果您不想迭代两次,请使用reduce

data.reduce( (a, c) => {
c.website === "google" ? a.push( c.name ) : "";
return a; //return accumulator
} , []); //initialize accumulator

您可以将map方法与filter结合使用,并为每个方法传递回调提供的函数。

let data = [{"name":"Lenovo Thinkpad 41A4298","website":"google"}, {"name":"Lenovo Thinkpad 41A2222","website":"google"}, {"name":"Lenovo Thinkpad 41Awww33","website":"yahoo"}, {"name":"Lenovo Thinkpad 41A424448","website":"google"}, {"name":"Lenovo Thinkpad 41A429rr8","website":"ebay"}, {"name":"Lenovo Thinkpad 41A429ff8","website":"ebay"}, {"name":"Lenovo Thinkpad 41A429ss8","website":"rediff"}, {"name":"Lenovo Thinkpad 41A429sg8","website":"yahoo"}]
names = data.filter(function(item){
return item.website == 'google';
}).map(function(item){
return item.name;
});
console.log(names)

另一种方法是使用arrow函数并解构参数。

let data = [{"name":"Lenovo Thinkpad 41A4298","website":"google"}, {"name":"Lenovo Thinkpad 41A2222","website":"google"}, {"name":"Lenovo Thinkpad 41Awww33","website":"yahoo"}, {"name":"Lenovo Thinkpad 41A424448","website":"google"}, {"name":"Lenovo Thinkpad 41A429rr8","website":"ebay"}, {"name":"Lenovo Thinkpad 41A429ff8","website":"ebay"}, {"name":"Lenovo Thinkpad 41A429ss8","website":"rediff"}, {"name":"Lenovo Thinkpad 41A429sg8","website":"yahoo"}]
names = data.filter(({website}) => website == 'google').map(({name}) => name);
console.log(names)

使用reduce根据条件推送到另一个数组:

const data = [{"name":"Lenovo Thinkpad 41A4298","website":"google"},
{"name":"Lenovo Thinkpad 41A2222","website":"google"},
{"name":"Lenovo Thinkpad 41Awww33","website":"yahoo"},
{"name":"Lenovo Thinkpad 41A424448","website":"google"},
{"name":"Lenovo Thinkpad 41A429rr8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ff8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ss8","website":"rediff"},
{"name":"Lenovo Thinkpad 41A429sg8","website":"yahoo"}];
const nameArr = data.reduce((nameArr, { name, website }) => {
if (website === 'google') nameArr.push(name);
return nameArr;
}, []);
console.log(nameArr);

您可以简单地映射对象数组,如果 item.website === 'google',则将 item.name 推送到数组中。请参阅下面的工作解决方案...

let theJSON = [
{"name":"Lenovo Thinkpad 41A4298","website":"google"},
{"name":"Lenovo Thinkpad 41A2222","website":"google"},
{"name":"Lenovo Thinkpad 41Awww33","website":"yahoo"},
{"name":"Lenovo Thinkpad 41A424448","website":"google"},
{"name":"Lenovo Thinkpad 41A429rr8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ff8","website":"ebay"},
{"name":"Lenovo Thinkpad 41A429ss8","website":"rediff"},
{"name":"Lenovo Thinkpad 41A429sg8","website":"yahoo"}
]
let nameArray = []
theJSON.map((item) => {
if (item.website === 'google') {
nameArray.push(item.name)
}
})
console.log(nameArray)

最新更新