假设我有一个这样的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 数组以仅包含google
website
的条目,我有这个:
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.body
data_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)