在Javascript中的对象数组中查找属性名称

时间:2017-10-30 04:59:04

标签: javascript arrays sorting object

假设我们有一个数组:

var array = [
{name1: 'value1'},
{name1: 1},
{name2: 'value2'},
{name2: 2},
{name4: [{name4a: 'value4a'}, {name4b: 'value4b'}]},
{name5: [{name5a: 'value5a'}, {name5b: 'value5b'}]}
];

其中属性名称和值是随机的,但有些知道名称经常重复。我想检查数组是否具有特定的属性名称(可以多于一个),用索引位置显示它,检查它有什么值。

我可以映射数组并显示正确的属性名称,但是因为我是初学者我不知道如何迭代结果......

function extractArrayPropertyName(array, property_name)
{
    return array.map(function(item)
    {
        console.log(item[property_name]);
        // I want to display only the matched names, iterate over results and check the value
    });
}

任何想法?

2 个答案:

答案 0 :(得分:0)

您可以使用以下方法遍历对象的键:

for(var key in array[i])

您将不得不递归搜索以查找所有嵌套键。我已经把一个快速的解决方案组合在一起,可以满足您的需求:

function extractArrayPropertyName(array, property_name) {
    let result = [];
    for (let i = 0; i < array.length; i++) {
        for (let key in array[i]) {
            if (Array.isArray(array[i][key]))
                result = result.concat(extractArrayPropertyName(array[i][key], property_name));
            else if (array[i][property_name] !== undefined)
                result.push(array[i]);
        }
    }
    return result;
}

答案 1 :(得分:0)

您可以使用迭代和递归方法,在索引数组上使用闭包来获取元素的路径。

结果如下:

[
    [0, "value1"],  // result 1 on index 0 with value 'value1'
    [1, 1]          // result 2
]

或嵌套结果

[
    [4, 0, "value4a"] // 4 and 0 are the indices.
]

function getKeyIndex(array, key) {
    return array.reduce(function iter(path) {
        return function (r, o, i) {
            Object.keys(o).forEach(function (k) {
                if (k === key) {
                    r.push(path.concat([i, o[key]]));
                    return;
                }
                if (Array.isArray(o[k])) {
                    r = r.concat(o[k].reduce(iter(path.concat(i)), []));
                }
            });
            return r;
        };
    }([]), []);
}

var array = [{ name1: 'value1' }, { name1: 1 }, { name2: 'value2' }, { name2: 2 }, { name4: [{ name4a: 'value4a' }, { name4b: 'value4b' }] }, { name5: [{ name5a: 'value5a' }, { name5b: 'value5b' }] }];

console.log(getKeyIndex(array, 'name1'));
console.log(getKeyIndex(array, 'name4a'));
.as-console-wrapper { max-height: 100% !important; top: 0; }